我正在使用连续种子(1,2,3,4,...)在模拟中生成随机数。种子彼此接近的事实是否使得生成的伪随机数也相似?
我认为它没有改变任何东西,但我正在使用python
编辑:我做了一些测试,数字看起来并不相似。但我担心仅通过查看数字就无法注意到这种相似性。随机数生成是否有任何理论特征可以保证不同种子提供完全独立的伪随机数?
答案 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