Python 在随机数生成中,近种子可能会给出类似的随机数吗?

Python 在随机数生成中,近种子可能会给出类似的随机数吗?,python,random,seed,Python,Random,Seed,我使用顺序种子(1,2,3,4,…)在模拟中生成随机数。种子彼此靠近的事实是否也使生成的伪随机数相似 我认为它不会改变任何事情,但我正在使用python 编辑:我做了一些测试,结果看起来不一样。但我担心,仅仅从数字上看不出这种相似性。随机数生成的理论特征是否保证不同的种子产生完全独立的伪随机数?首先:定义相似性。下一步:编写一个相似性测试代码。然后:检查相似性 只有一个模糊的相似性描述,很难检查它。你在做什么样的模拟 出于模拟目的,您的论点是有效的(取决于模拟的类型),但是如果您在模拟以外的环境

我使用顺序种子(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种子

因为您知道主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