10

I'm using sequential seeds (1,2,3,4,...) for generation of random numbers in a simulation. Does the fact that the seeds are near each other make the generated pseudo-random numbers similar as well?

I think it doesn't change anything, but I'm using python

Edit: I have done some tests and the numbers don't look similar. But I'm afraid that the similarity cannot be noticed just by looking at the numbers. Is there any theoretical feature of random number generation that guarantees that different seeds give completely independent pseudo-random numbers?

4

6 回答 6

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
于 2012-06-05T20:42:38.927 回答
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()...
于 2016-07-20T13:01:24.720 回答
0

你在做什么模拟?

出于模拟目的,您的论点是有效的(取决于模拟的类型),但如果您在模拟以外的环境中实现它,那么如果它要求基于生成的随机数存在环境安全问题,那么它很容易被黑客入侵.

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

于 2012-06-05T20:23:38.827 回答
0

第一:定义相似性。下一步:编写相似性测试。然后:检查相似性。

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

于 2012-06-05T16:48:16.030 回答
0

引用 random 模块中的文档:

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

  • 周期为 2**19937-1。
  • 它是现存最广泛测试的生成器之一。

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

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

于 2012-06-05T21:20:28.547 回答
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
于 2012-06-06T11:45:26.153 回答