随机数生成的近种子可以给出类似的随机数?

时间:2012-06-05 16:09:15

标签: python random seed

我正在使用连续种子(1,2,3,4,...)在模拟中生成随机数。种子彼此接近的事实是否使得生成的伪随机数也相似?

我认为它没有改变任何东西,但我正在使用python

编辑:我做了一些测试,数字看起来并不相似。但我担心仅通过查看数字就无法注意到这种相似性。随机数生成是否有任何理论特征可以保证不同种子提供完全独立的伪随机数?

6 个答案:

答案 0 :(得分:3)

根据定义,种子和生成的随机数之间肯定存在相关性。问题是随机化算法是否足以产生似乎不相关的结果,你应该研究评估随机性的方法来回答这个问题。

尽管如此,你是对的。以下是Microsoft的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

答案 1 :(得分:1)

我已经发现,当使用连续种子进行多次模拟时,从Mersenne Twister生成的随机数中可测量但很小的相关性 - 其结果被平均以产生最终结果。在linux上的python中,如果我通过random.SystemRandom()使用由系统随机函数(非伪随机数)生成的种子,则相关性消失。我将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()...

答案 2 :(得分:0)

首先:定义相似性。下一步:编码相似性测试。然后:检查相似性。

只有模糊的相似性描述,很难检查它。

答案 3 :(得分:0)

你在做什么样的模拟?

出于模拟目的,您的参数是有效的(取决于模拟的类型),但如果您在模拟之外的环境中实现它,那么如果它需要基于环境的安全性问题,则可能很容易被攻击。生成随机数。

如果您正在模拟机器的结果是否对社会有害,那么结果的结果将是不可接受的。它需要尽可能多的随机性,我永远不会相信你的推理。

答案 4 :(得分:0)

引用随机模块中的文档:

  

关于底层Mersenne Twister核心生成器的一般说明:

     
      
  • 期限是2 ** 19937-1。
  •   
  • 它是现存最广泛测试的发电机之一。
  •   

我更担心我的代码被破坏而不是我的RNG不够随意。一般来说,你对随机性的直觉感觉是错误的 - 即使它们不存在,人类的头脑也非常善于找到模式。

只要您知道由于缺少随机播种而您的结果不会“安全”,您应该没问题。

答案 5 :(得分:0)

如果您担心顺序种子,请不要使用连续种子。设置具有已知种子的主RNG,然后从该主RNG获取连续输出,以根据需要为各种子RNG播种。

因为您知道主RNG的初始种子,所以如果需要,可以像以前一样再次运行整个模拟。

masterSeed <- 42
masterRNG <- new Random(masterSeed)

childRNGs[] <- array of child RNGs

foreach childRNG in childRNGs
   childRNG.setSeed(masterRNG.next())
endforeach