【发布时间】:2019-11-20 19:51:58
【问题描述】:
我可以使用两种方法中的一种来创建具有两个重要特征的伪随机数序列 - (1) 它可以在不同的机器上重现,以及 (2) 序列从不重复范围内的数字,直到所有数字都被发出.
我的问题是 - 这些方法中的任何一种在可移植性(操作系统、Python 版本等)方面是否存在潜在问题?例如,有谁知道当 XXX 为真时,我是否会在一个系统上得到一组结果,而在另一个系统上得到不同的结果?
我并不是真的在寻求关于使用哪种方法本身的建议,只有当 Z 为真时我应该注意 Y 系统上的 X。
我尝试了几个版本的 Linux,都是 64 位的,它们看起来是一致的,但我无法轻松访问 Windows 或 32 位版本。
请注意,它们不会产生彼此相同的范围,但这对于我的目的来说是可以的。这些数字在人眼看来是随机的。
方法 1
使用原生 Python 库函数从一个范围内生成随机样本。如果我使用大范围(10m 或更大)会很慢,但对于相对较小的范围来说还可以,而且对于没有数学学位的人来说更容易理解:
import random
random.seed(5)
x = random.sample(range(10000,99999),89999)
for i in range(10):
print(x[i])
方法 2
使用不是来自 Python 库的算法:
(https://en.wikipedia.org/wiki/Linear_congruential_generator)
即使在大范围内它也非常快,但更难理解并因此发现潜在问题:
def lcg(modulus, a, c, seed):
while True:
seed = (a * seed + c) % modulus
yield seed
m = 10000019
c = int(m/2)
a = 5653
s = a
g = lcg(m,a,c,s)
for _ in range(10):
print(next(g))
请注意,我对替代方案持开放态度;最初的问题是在这里提出的:https://math.stackexchange.com/questions/3289084/generate-a-pseudo-random-predictable-non-repeating-integer-sequence-purely-math
【问题讨论】:
-
@Dukeling - RNG 只需对人类有益(即看起来像是随机的),只要它不重复并且可以在机器之间复制。我想这个问题是模糊的,我猜可移植性问题可能包括事情是如何在引擎盖下工作的,这可能会使一台机器上的种子与另一台机器上的行为不同。我倾向于发现其他更有经验的人只是“知道”这些事情,所以我认为值得一问。我当然会尽可能多地测试。
-
只使用特定的RNG。如果您的 LCG 满足您的需求,请使用它,没有理由担心它。 python 和几乎所有其他编程语言都是关于可移植性的,如果它们的行为在机器之间发生变化,它们将没有多大用处。
标签: python algorithm math random