免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1601 | 回复: 4
打印 上一主题 下一主题

偶然发现的一个随机数问题,请教大家 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-30 20:10 |只看该作者 |倒序浏览
这两段代码有什么不同?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int get_random_num( int len )
{
        int val;
        srand((unsigned)time(NULL));
        val = rand() % len;
        return val;
}

int main( int argc, char **argv )
{
          for(int i = 0;i<10;i++)
        {
            printf("The sujishu is %d\n",get_random_num(10));  
        }
       return 0;
}
生成的随机数永远都是一样的
但如果这样写
int main( int argc, char **argv )
{
        srand((unsigned)time(NULL));
        for(int i = 0;i<10;i++)
        {
            printf("The sujishu is %d\n",rand()%10);  
        }
       return 0;
}
则能按照要求生成需要的10以内的随机数,不觉得这两段代码有什么质的区别,难道用时间做种只能做一次,请高手执教

论坛徽章:
0
2 [报告]
发表于 2010-03-30 22:10 |只看该作者
程序运行时间很短,故每次time(NULL)返回值一样

论坛徽章:
1
天秤座
日期:2014-04-27 07:42:20
3 [报告]
发表于 2010-03-30 22:53 |只看该作者
设置种子的语句不能放循环体里面,否则相当于在很短的时间内重置种子,输出必定是一样的。一般取随机数,把srand((unsigned)time(NULL)); 放到main里面,执行一次就行了

论坛徽章:
0
4 [报告]
发表于 2010-03-30 23:09 |只看该作者
from Man:

       The srand() function sets its argument as the seed for a  new  sequence
       of  pseudo-random  integers  to be returned by rand().  These sequences
       are repeatable by calling srand() with the same seed value.

论坛徽章:
0
5 [报告]
发表于 2010-03-31 11:49 |只看该作者
呵呵,你没明白我的代码意思啊,而且也不知道c里面随机数的定义.其实c里面的随机数是伪随机,也就是种子一旦确定,后面每次生成随机数都是同一个规律.你可以这样试一下,srand(123456),然后打印10次,看看每次运行是不是同样结果.我的程序中每次取的是当前微秒数做种子,就是为了保证每次取到的种子是不同的.而你第一段代码改了其中取种子的步骤,变成取当前unixtimestamp.所以单位是秒,在10次循环里极大概率会取到同一个种子,所以会得到同一个数,而你的第二段代码为什么会得到看上去随机的10个数是因为你一开始就取好种子了,只是接着再调用10次rand而已.你可以试一下把你第二段代码fork,看看打印出来的10个数字是不是相同.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP