Python 在随机数生成中,近种子可能会给出类似的随机数吗?
我使用顺序种子(1,2,3,4,…)在模拟中生成随机数。种子彼此靠近的事实是否也使生成的伪随机数相似 我认为它不会改变任何事情,但我正在使用pythonPython 在随机数生成中,近种子可能会给出类似的随机数吗?,python,random,seed,Python,Random,Seed,我使用顺序种子(1,2,3,4,…)在模拟中生成随机数。种子彼此靠近的事实是否也使生成的伪随机数相似 我认为它不会改变任何事情,但我正在使用python 编辑:我做了一些测试,结果看起来不一样。但我担心,仅仅从数字上看不出这种相似性。随机数生成的理论特征是否保证不同的种子产生完全独立的伪随机数?首先:定义相似性。下一步:编写一个相似性测试代码。然后:检查相似性 只有一个模糊的相似性描述,很难检查它。你在做什么样的模拟 出于模拟目的,您的论点是有效的(取决于模拟的类型),但是如果您在模拟以外的环境
编辑:我做了一些测试,结果看起来不一样。但我担心,仅仅从数字上看不出这种相似性。随机数生成的理论特征是否保证不同的种子产生完全独立的伪随机数?首先:定义相似性。下一步:编写一个相似性测试代码。然后:检查相似性
只有一个模糊的相似性描述,很难检查它。你在做什么样的模拟 出于模拟目的,您的论点是有效的(取决于模拟的类型),但是如果您在模拟以外的环境中实现它,那么如果它要求基于生成的随机数存在环境的安全问题,那么它可能很容易被黑客攻击
如果你正在模拟一台机器的结果,不管它是否对社会有害,那么你的结果将是不可接受的。它需要尽可能多的随机性,我永远不会相信你的推理。根据定义,种子和生成的随机数之间肯定会有关联。问题是随机化算法是否足以产生看起来不相关的结果,你应该研究评估随机性的方法来回答这个问题 不过你担心是对的。下面是微软的C++代码> RAND 函数,其种子值从0到9:
38 7719 21238 2437 8855 11797 8365 32285 10450 30612
41 18467 6334 26500 19169 15724 11478 29358 26962 24464
45 29216 24198 17795 29484 19650 14590 26431 10705 18316
48 7196 9294 9091 7031 23577 17702 23503 27217 12168
51 17945 27159 386 17345 27504 20815 20576 10960 6020
54 28693 12255 24449 27660 31430 23927 17649 27472 32640
58 6673 30119 15745 5206 2589 27040 14722 11216 26492
61 17422 15215 7040 15521 6516 30152 11794 27727 20344
64 28170 311 31103 25835 10443 497 8867 11471 14195
68 6151 18175 22398 3382 14369 3609 5940 27982 8047
要引用随机模块中的文档,请执行以下操作: 关于底层Mersenne捻线机铁芯生成器的一般说明:
- 期间为2**19937-1
- 它是现有测试最广泛的发电机之一
只要您知道由于缺少随机种子而导致的结果不“安全”,您就应该没事。如果您担心顺序种子,那么不要使用顺序种子。设置一个具有已知种子的主RNG,然后根据需要从该主RNG获取连续输出,以为各种子RNG种子 因为您知道主RNG的初始种子,所以如果需要,整个模拟可以再次运行,与之前完全一样
masterSeed <- 42
masterRNG <- new Random(masterSeed)
childRNGs[] <- array of child RNGs
foreach childRNG in childRNGs
childRNG.setSeed(masterRNG.next())
endforeach
masterSeed我发现,当使用顺序种子进行多次模拟时,Mersenne捻线机产生的随机数之间存在可测量的、但很小的相关性——对结果进行平均以产生最终结果。在linux上的python中,如果我使用系统随机函数(非伪随机数)通过random.SystemRandom()生成的种子,相关性就会消失。我将系统随机数存储在文件中,并在模拟中需要种子时读取它们。
要生成种子:
import random
myrandom = random.SystemRandom
x = myrandom.random # yields a number in [0,1)
dump x out to file...
然后当需要种子的时候
import random
read x from file...
newseed = int(x*(2**31)) # produce a 32 bit integer
random.seed(newseed)
nextran = random.random()
nextran = random.random()...
如果您不信任RNG(我承认有点黑客),您可以做的是将种子从hashlib
传递给SHA1算法;这是为了将类似的值映射到完全不同的值。我注意到了这种效果,但我认为是微软C++,而不是Python。我相信random
模块使用了更好的算法。这是我最近发现的一篇有趣的帖子:-)对不起,你这么说是什么意思:“你的结果不会是‘安全的’,因为你没有随机播种”?你说的“安全”是什么意思?你真的是说因为我的连续播种而不安全吗?这似乎与你之前所说的随机模块值得信赖的说法背道而驰…@Homero:我的意思是,如果你为了任何安全目的使用这种随机性,那么你很容易受到任何知道你的种子植入方法的人的攻击。如果,OTOH,你正在运行某种模拟,只是想要可复制的结果,你应该得到“足够”的随机性。-1因为问题是一系列相关种子如何影响产生的随机数的质量,而不是基于单个种子的随机数的质量。例如,当在多线程程序开始时创建一组不同的生成器(可能每个线程一个)时,这个问题是相关的。您希望避免生成器之间的相关结果。我认为@rossum的答案是一个很好的解决方法。rand
在某些平台上是出了名的不可靠。Python的random
模块使用Mersenne Twister算法,该算法被认为不适合加密,但比大多数rand
的实现要好得多。你能描述一下你是如何测量相似性的吗?我无法进入我的特定应用程序,但结果几乎与相似的——附近的随机数相反(几个电话分开)稍微负相关,因为如果一个电话少于某个小数字(~0.01),然后接下来的几次不太随机,可能也不太可能。我没有做过广泛的测试,可能在这里跳了枪,但在多个连续种子的大量模拟实例中有一个一致的趋势。我不确定这是否是一个好主意,因为你冒着复制种子的风险。例如,如果您正在生成16位数字并运行数千个进程,则很可能出现这种情况。该问题询问的是顺序种子,而不是重复种子。如果重复种子是一个问题,则使用128位分组密码并加密数字0、1、2、3、…2^128-1。作为密码,num