代码之家  ›  专栏  ›  技术社区  ›  Eb946207 mourshad

用Python生成第n个随机数

  •  -3
  • Eb946207 mourshad  · 技术社区  · 8 年前

    用类似 [random.randint(0, 100) for n in range(1000)] 要生成1000个从0到100的随机数, 我不知道我需要多少数字。我想说的是 random.nth_randint(0, 100, 5)

    3 回复  |  直到 8 年前
        1
  •  3
  •   Ilia Gilmijarow    8 年前

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

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

    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
  •  1
  •   abc    8 年前

    如果我能理解你的问题,你每次都一样 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))
    
        3
  •  0
  •   Olivier Melançon iacob    8 年前

    使用 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
    
        4
  •  0
  •   David Parks    6 年前

    Numpy新的随机位发生器接口提供了一种方法 advance(delta)

    从文档中:

    推进基础RNG,如同已发生增量绘制。

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