用种子生成随机数

时间:2016-07-24 09:01:10

标签: python

所以在游戏中你可以创建"随机"世界有种子选择。我不明白的是:如果你填上同样的种子,怎么能得到同样的结果?我会说你必须存储每一个结果,但这很难实现。我读过有关PRNG(伪随机数发生器)的一些内容。每个结果都在PRNG中确定。但我不知道如何在python中实现这一目标

4 个答案:

答案 0 :(得分:1)

只需使用random.seed

import random

random.seed(42)
random.random() # 0.6394267984578837

该程序将始终将该值作为第一个生成的随机数返回,因为种子始终是相同的。

答案 1 :(得分:1)

如果给定相同的种子,RNG如何最终生成相同的序列?

让我们采取一个简单的RNG实施:

class SillyRand:
    """Don't try this at home!"""

    def __init__(self, seed):
        self.current = self.calc(seed)

    def get(self):
        current_ = self.current
        self.current = self.calc(current_)
        return current_

    def calc(self, prev):
        return ((prev * 7) + 17) % 100

此实现包含许多缺陷,但它应足以证明该概念。 它使用seed作为序列中第一个随机数的前身。

如果我们运行这个:

print("Seed is 123")
r = SillyRand(123)
for i in range(10):
    print(r.get())

输出将是:

Seed is 123
78
63
58
23
78
63
58
23
78
63

用不同的种子......

print("Seed is 42")
r = SillyRand(42)
for i in range(10):
    print(r.get())

我们得到一个不同的序列:

Seed is 42
11
94
75
42
11
94
75
42
11
94

但同样的种子每次运行都会给出相同的序列。

答案 2 :(得分:0)

实际上很简单,首先你必须导入随机库,然后你必须使用游戏的种子值手动设置种子:

import random
your_seed = 1234
random.seed(seed)
random.randint(1, 10)

答案 3 :(得分:0)

PRNG不会创建“随机”数字,但在使用相同种子时始终生成相同的数字。因此,如果你根据这些数字做某事,当你输入相同的种子时,你总会这样做。

在python中,random模块将获取种子,请参阅the documentation。如果您不提供种子,则选择当前系统时间,因此它似乎是随机的,并且通常是随机的。

示例可以帮助您了解这与级别创建的关系。

import random
elements = ["Enemy1", "Enemy2", "Powerup", "Hazard", "empty", "empty", "empty"]
level_length = 100
seed = 100
random.seed(100)

level = []

for i in range(level_length):
    level.append(random.choice(elements))

print(level)

这将生成一个随机级别 - 除了它不是随机的,而是依赖于种子。如果您选择不同的种子,您将获得不同的级别。但是如果你选择相同的种子,你将得到相同的水平。

当然,这只是一维水平,但二维或三维水平相同。