用Python生成第n个随机数

时间:2018-09-03 20:44:56

标签: python python-3.x random

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

4 个答案:

答案 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。

https://numpy.org/doc/stable/reference/random/bit_generators/generated/numpy.random.PCG64.advance.html#numpy.random.PCG64.advance