Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python生成第n个随机数_Python_Python 3.x_Random - Fatal编程技术网

使用Python生成第n个随机数

使用Python生成第n个随机数,python,python-3.x,random,Python,Python 3.x,Random,我试图生成用于生成世界一部分的随机数(我正在为游戏生成世界)。我可以用类似于[random.randint(0100)for n in range(1000)]的东西来创建这些,以生成从0到100的1000个随机数,但我不知道我需要一个列表中有多少个数字。我想要的是能够说一些类似于random.nth_randint(0,100,5)的话,它将生成从0到100的第5个随机数。(只要你使用相同的种子,每次都是相同的数字)我该怎么做?如果没有办法做到这一点,我怎么能得到同样的行为呢?如果我能很好地理

我试图生成用于生成世界一部分的随机数(我正在为游戏生成世界)。我可以用类似于
[random.randint(0100)for n in range(1000)]
的东西来创建这些,以生成从0到100的1000个随机数,但我不知道我需要一个列表中有多少个数字。我想要的是能够说一些类似于
random.nth_randint(0,100,5)
的话,它将生成从0到100的第5个随机数。(只要你使用相同的种子,每次都是相同的数字)我该怎么做?如果没有办法做到这一点,我怎么能得到同样的行为呢?

如果我能很好地理解你的问题,你每次都会问同一个
n-th
号码。您可以创建一个类来跟踪生成的数字(如果使用相同的
种子
)。
其主要思想是,当您请求第n个数字时,它将生成所有前一个数字,以便在程序的所有运行中始终相同

import random

class myRandom():
    def __init__(self):
        self.generated = []
        #your instance of random.Random()
        self.rand = random.Random(99)

    def generate(self, nth):
        if nth < len(self.generated) + 1:
            return self.generated[nth - 1]
        else:
            for _ in range(len(self.generated), nth):
                self.generated.append(self.rand.randint(1,100))
            return self.generated[nth - 1]

r = myRandom()
print(r.generate(1))
print(r.generate(5))
print(r.generate(10))
随机导入
类myRandom():
定义初始化(自):
self.generated=[]
#您的random.random()实例
self.rand=random.random(99)
def生成(自我,第n个):
如果n
Python的随机模块生成确定性伪随机值

简单地说,它的行为就像在提供种子(或从操作系统获取默认种子)时生成了一个预定值列表,并且对于给定种子,这些值将始终相同。 这基本上就是我们想要的

因此,要获得第N个随机值,您需要记住每个生成值的状态(可能只是跟踪这些值会减少内存消耗),或者您需要每次重置(重新设定)生成器,并每次生成N个随机数以获得您的值

def randgen(a, b, n, seed=4):
    # our default seed is random in itself as evidenced by https://xkcd.com/221/
    random.seed(seed)
    for i in range(n-1):
        x = random.random()
    return random.randint(a, b)

使用
defaultdict
,您可以拥有一个在第一次访问每个密钥时生成新号码的结构

from collections import defaultdict
from random import randint

random_numbers = defaultdict(lambda: randint(0, 100))

random_number[5] # 42
random_number[5] # 42

random_number[0] # 63
因此,在访问时会延迟生成数字

由于您正在制作游戏,因此可能需要通过中断程序来保存
随机数。您可以使用
pickle
保存数据

import pickle

random_numbers[0] # 24

# Save the current state
with open('random', 'wb') as f:
    pickle.dump(dict(random_numbers), f)

# Load the last saved state
with open('random', 'rb') as f:
    opened_random_numbers = defaultdict(lambda: randint(0, 100), pickle.load(f))

opened_random_numbers[0] # 24

Numpy新的随机位生成器接口提供了一种方法
advance(delta)
一些位生成器实现(包括使用的默认位生成器)。此函数允许您播种,然后前进以获得第n个随机数

从文档中:

推进基础RNG,就像发生了增量绘制一样


我不清楚为什么不在需要时使用random.randint(0,100),而不是使用第五个随机生成的数字。您到底为什么需要重新创建第五个随机数字?在您使用它生成地图的一部分后,为什么需要再次访问它?首先,您需要创建自己的
random.random
实例,并使用
.seed()
设置其种子,但这可能不能保证在不同的机器上生成相同的数字,我不确定。任何PRNG都可以做到这一点。参见示例:下面的第二个答案有一个很好的解决方案,但是对于程序的不同运行,
随机数[5]
在这方面是不一样的,这正是我想要的,任何随机生成的数字!谢谢我只需要使用random.seed()您还可以保存状态。