使用Python生成第n个随机数

问题描述 投票:-3回答:3

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

python python-3.x random
3个回答
1
投票

Python的随机模块产生确定性伪随机值。

换句话说,当提供种子时(或者当从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)

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))

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
© www.soinside.com 2019 - 2024. All rights reserved.