【问题标题】:Why is srand(time(NULL)) working smoothly even though I repeatedly reset it?为什么 srand(time(NULL)) 工作顺利,即使我反复重置它?
【发布时间】:2017-04-09 00:25:51
【问题描述】:

我有一个函数可以创建一个大小为 N 的向量,并将其打乱:

void rand_vector_generator(int N) {
   srand(time(NULL));
   vector <int> perm(N);
   for (unsigned k=0; k<N; k++) {
      perm[k] = k;
   }
   random_shuffle(perm.begin(),perm.end());
}

我正在使用循环从我的主函数中调用它:

for(int i=0; i<20; i++)
    rand_vector_generator(10);

我希望这不会在我的洗牌中给我足够的随机性,因为我在每次函数调用时都调用srand(time(NULL));,并且种子与连续调用没有太大不同。我的理解是我调用srand(time(NULL)); 一次而不是多次,因此种子不会“重置”。

thread 在某种程度上肯定了我所期望的结果。

相反,我得到:

6 0 3 5 7 8 4 1 2 9 
0 8 6 4 2 3 7 9 1 5 
8 2 4 9 5 0 6 7 1 3 
0 6 1 8 7 4 5 2 3 9 
2 5 1 0 3 7 6 4 8 9 
4 5 3 0 1 7 2 9 6 8 
8 5 2 9 7 0 6 3 4 1 
8 4 9 3 1 5 7 0 6 2 
3 7 6 0 9 8 2 4 1 5 
8 5 2 3 7 4 6 9 1 0 
5 4 0 1 2 6 8 7 3 9 
2 5 7 9 6 0 4 3 1 8 
5 8 3 7 0 2 1 6 9 4 
7 4 9 5 1 8 2 3 0 6 
1 9 2 3 8 6 0 7 5 4 
0 6 4 3 1 2 9 7 8 5 
9 3 8 4 7 5 1 6 0 2 
1 9 6 5 3 0 2 4 8 7 
7 5 1 8 9 3 4 0 2 6 
2 9 6 5 4 0 3 7 8 1 

这些向量对我来说似乎是随机打乱的。我错过了什么? srand 调用是否以某种方式存在于与函数调用不同的范围内,因此它不会在每次调用时都被重置?还是我在这里误解了更基本的东西?

【问题讨论】:

  • random_shuffle 不一定调用rand
  • 该标准在random_shuffle 中肯定有一些内容en.cppreference.com/w/cpp/algorithm/random_shuffle 是 (3) 唯一在 C++17 及更高版本中有效的标准?
  • 你如何判断某事物是否具有“足够的随机性”?您是否进行了任何统计测试?
  • 调用std::srand(std::time(0)) 应该只是在每一秒内给你相同的种子,它仍然会导致随机数生成器生成适当的随机数。
  • std::random_shuffle 不会洗牌,所以每个可能的排列都有“相等”的概率吗?您必须检查每个排列发生的频率。基本上,对于两个元素“1”和“2”的向量,“12”和“21”应该各出现 50% 的时间。

标签: c++ random srand


【解决方案1】:

根据标准,std::randstd::random_shufflestd::shuffle 中的使用是实现定义的(尽管经常使用std::rand 这是不保证)。在另一个编译器上试试?另一个平台?

如果你想确定使用std::rand,你应该让你的代码明确使用它(例如,使用lambda表达式):

random_shuffle(perm.begin(), perm.end(), []{return std::rand();});

在一个有点不相关的注释中,time() 的精度是 一整秒,您的代码运行速度比这快得多(我希望如此),所以对 srand() 的多次调用会导致重置为相同的种子

【讨论】:

  • Std::rand 没有正确的签名作为 std::random_shuffle 的第三个参数。
  • 你是对的。我应该说“伪代码”,因为这只是说明它应该如何完成,而不是实际的实现。
猜你喜欢
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多