【问题标题】:Why use "time" in srand?为什么在 srand 中使用“时间”?
【发布时间】:2021-04-23 07:44:44
【问题描述】:

我喜欢通过乱搞代码来学习,最近我复制并粘贴了一个随机数生成器代码。然后我删除了所有不是“必要”的代码行,以使可执行文件能够生成随机数。最后一根稻草是我从 srand 中删除“时间”。

srand((无符号)时间(0));

这里的“time(0)”是什么意思?

它是否使用程序打开的时间来生成随机数的种子?这就是为什么删除它(时间)使它不起作用的原因吗?因为那它没有种子?

还有……

include <stdlib.h> 
include <stdio.h> 
include <time.h>

int main() 
{

srand((unsigned) time(0));

printf("Your dice has been rolled! You got:");

int result = 1 + (rand() % 20);

printf("%d", result);

}

这就是整个代码,我注意到它使用“rand”结果作为输出。 “rand”会从“srand”中拉出种子吗?

【问题讨论】:

  • 您应该能够自己弄清楚:只需运行您的程序几次,使用和不使用 srand,然后看看您是否可以自己找出答案。它应该是可行的。当您看到结果时,答案应该非常明显。
  • 传递给 srand 的种子不一定是 time(0) - 它可以是每次调用 srand 时不同的任何值。当前时间每次都不同,但您也可以要求用户输入一个随机数(假设您相信它们是随机的),或者您可以计算日志文件中的行数(假设您相信它总是改变)或其他东西。不需要您做任何工作的最简单的事情是当前时间,这就是为什么经常使用 time(0)。
  • 只是在这里指出 rand() 的随机性足够有趣,但您可能需要更好的东西来进行严肃的工作。

标签: c++ srand


【解决方案1】:

如果您不“播种”随机数生成器(或者如果您使用相同的种子值),您将获得相同的伪随机数集。

使用当前时间是每次获取不同种子的简单方法。

【讨论】:

  • 不只是相同的数字;相同的序列
【解决方案2】:

srand 的作用是不能跨线程,所以随机数种子应该在每个线程上设置一次。 @Buddy 说使用 time(0) 是最方便的方法,每次调用都会得到不同的种子。当然你可以使用原子变量。

std::atomic<int> seek(2374213);  //init whatever you like
  
void thread1fun()
{
  srand(++seek);
  //...
  int rand_num = rand();
}

void thread2fun()
{
  srand(++seek);
  //...
  int rand_num = rand();
}

【讨论】:

  • so the random number seed should be set once on each thread 任何参考资料? CppRefGenerally speaking, the pseudo-random number generator should only be seeded once, before any calls to rand(), and the start of the program. It should not be repeatedly seeded, or reseeded every time you wish to generate a new batch of pseudo-random numbers.
  • 我找到了一个参考 here,但它仅适用于 Windows。
  • @Sprite — 它不是用于 Windows,而是用于 Microsoft 的编译器。
猜你喜欢
  • 2018-11-19
  • 2021-11-25
相关资源
最近更新 更多