我正在尝试生成用于生成世界一部分的随机数(我正在为游戏创建世界)。我可以用[random.randint(0, 100) for n in range(1000)]
之类的东西来创建这些数字,以生成0到100之间的1000个随机数,但是我不知道列表中需要多少个数字。我想要的是能够说出类似random.nth_randint(0, 100, 5)
这样的东西,它将生成从0到100的第5个随机数。(只要您使用相同的种子,每次都使用相同的数字)我将如何去做?如果没有办法做到这一点,我还能如何获得相同的行为?
答案 0 :(得分:1)
如果我很了解您的问题,那么您每次都希望使用相同的n-th
号。您可以创建一个类来跟踪生成的数字(如果使用相同的seed
)。
主要思想是,当您要求输入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))
答案 1 :(得分:1)
Python的random模块产生确定性的伪随机值。
简而言之,当提供种子时(或从OS获取默认种子时),它的行为就好像它生成了一组预定值,并且对于给定的种子,这些值将始终相同。 基本上这就是我们想要的。
因此,要获取第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)
答案 2 :(得分:0)
使用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
因此,访问时会延迟生成数字。
由于您正在开发游戏,因此很可能需要通过中断程序来保留random_numbers
。您可以使用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
答案 3 :(得分:0)
Numpy的新随机BitGenerator接口提供了一种advance(delta)
方法,用于某些BitGenerator实现(包括使用的默认BitGenerator)。此功能可让您播种,然后前进以获得第n个随机数。
从文档中
如果发生增量抽奖,则提前进行基础RNG。