使用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()您还可以保存状态。