我是靠谱客的博主 坚定仙人掌,最近开发中收集的这篇文章主要介绍多次调用 srand 引起 rand 产生同一随机数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

// vs 2008

#include "stdafx.h"
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>


int _tmain(int argc, _TCHAR* argv[])
{
int arr[10] = {0} ;
for (int i = 0 ;i < 10 ;i++)
{
srand(time(NULL)) ; // 产生随机种子
arr[i] = rand() ; // 产生随机数
}//for

return 0;
}

问题:

  看到了么, 全都是一个数字! 

   问题出现在 '产生随机种子' 的那一行. srand 是根据当前时间来得到一个随机数的基础值, 以后调用 rand 产生的随机值都是根据基础值计算得出. 也就是说, 同一个基础值一定会得到同一个随机值. 

   现在问题很明了了, 就是因为 CPU 速度太快, 导致 for 循环执行 10 次所用的时间对于 time 函数来说产生异样的结果. 因此调用 rand 产生的结果必然一样. 

解决方案:

  1.    如果在一个函数内做随机值的所有任务(即 srand 和 rand), 那么可以将 srand 放在 for 循环外. 
  2.    如果 srand 和 rand 会被执行多次, 那么可以设置一个无用的全局变量, 为的是执行 srand(time(NULL)):
int g_unused = (srand(time(NULL)), 0) ;     // Generate a seed for 'rand' in whole program.

int main()
{
...
}

 (因为 srand 是以 void 为返回值, 所以不得不使用逗号表达式来给全局变量赋值.)

转载于:https://www.cnblogs.com/walfud/articles/2190574.html

最后

以上就是坚定仙人掌为你收集整理的多次调用 srand 引起 rand 产生同一随机数的全部内容,希望文章能够帮你解决多次调用 srand 引起 rand 产生同一随机数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部