【问题标题】:Seeding rand() by itself自己播种 rand()
【发布时间】:2015-09-15 02:24:33
【问题描述】:

如果一个程序使用rand() 生成几个数字,存储最后一个rand() 结果,并在重复运行时使用srand(stored_seed),这会提供一些更短但仍然可用的随机数序列吗?

【问题讨论】:

  • 更简单的问题,如果我们在srand 之后立即存储第一个rand() 值,并将其用于下一次运行?
  • 您知道srand 应该运行一次,对吗?你的意思是程序被重复执行,还是rand被重复调用?
  • 你是说要每次都用生成的值给随机生成器播种?
  • 是的,但每个程序只运行一次。然后程序将按顺序提取几个值。
  • 高几率没有任何区别,rand() 使用了一个简单的 LCG,它已经使用了最后一个值。试试看。

标签: c random


【解决方案1】:

srand 应该只运行一次。如果您多次初始化它,结果序列可能不会那么随机。

初始化 PRNG 的一个好方法是srand(time(NULL)*getpid())

你也可以试试:

timeval t;
gettimeofday(&t, NULL);
srand((t.tv_usec/100) + (t.tv_sec/100));//getpid is optional

解释:

PRNG(伪随机数生成器)生成确定性 数字序列取决于所使用的算法。给定算法 总是从给定的起点产生相同的序列 (种子)。如果您没有明确看到 PRNG,那么它通常会 每次运行应用程序时都从相同的默认种子开始, 导致使用相同的数字序列。

要解决此问题,您需要自己为 PRNG 播种不同的种子 (给出不同的顺序)每次应用程序运行时。这 通常的方法是使用 time(NULL) 来设置种子 当前时间。只要你不启动两个实例 彼此在一秒钟内申请,您将得到保证 不同的随机序列。

每次您想要一个新的随机数时,无需为序列播种 数字。我不确定这一点,但我有一种感觉 取决于所使用的 PRNG 算法,为每个新的重新播种 number 实际上可能会导致结果中的随机性较低 顺序。 来源:link

【讨论】:

  • srand(time(NULL)) 如果应用程序运行超过每秒一次,将是灾难性的。
  • 另一方面,存储种子非常实用,例如。万一出现错误或失败,如果种子已知,可以轻松调试或重试运行。如果有一些get_seed() 函数就好了,但是没有...
  • 我已经编辑了我的答案。好吧,没有什么可以阻止您存储它,但它不需要多次初始化它。您可以将进程 pid 与时间结合使用,这应该在每次运行后为您提供不同的值。
  • 我发现您可以在“随机数”图上使用相关性来反转使用的算法并预测下一个数字。真正的随机数是由没有逻辑的来源生成的。
  • @Malina 是的,确实有可能。这种算法软件被称为伪随机。为了获得更好的随机性,硬件随机数生成器提供了一个很好的解决方案,该生成器使用随机物理(如温度或无线电波)事物来创建良好的熵。
猜你喜欢
  • 2012-10-24
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
相关资源
最近更新 更多