免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6835 | 回复: 12

[C] srand+rand函数产生的数字重复率太高,为什么 [复制链接]

论坛徽章:
0
发表于 2009-03-30 16:52 |显示全部楼层
10可用积分
我写了这么一个小程序:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
int main(void)
{
srand(time(NULL));
int r=abs(rand());
float f=r;
f/=RAND_MAX;
f*=13;
int result=(int)ceil(f);//为了产生1-13之间的随机数,代表扑克牌
printf("%d\n",result);
return 0;
}
在solaris8+CC上面编译,执行了./a.out若干次,输出的结果是:
12,6,7,13,1,7,8,1,2,8,2,3,9,10,3,10,10,4,11,4,5,11,5,12,6,12,13,6,13,1,7,1,1,2,8,9,2,3,10,4,10,,4,4,11

我发现:一个数字如果出现了,那么接下来3次运行,再次出现几率也是相当高的。我换成了g++(2.95.2)编译器,结果类似
3,9,3,10,3,4,10,4,11,4,5,5,12

这说明什么呢?srand并不能真的产生一个可靠的随机数种子?

还请dx指点!!

最佳答案

查看完整内容

你的种子是根据time(NULL)函数来的, 如果你点太快的话 生产的种子基本上一样,应该会影响你产生的随机数。 按自己的经验 只要相隔一秒以上 基本不得怎么这么频繁重复

论坛徽章:
0
发表于 2009-03-30 16:52 |显示全部楼层
你的种子是根据time(NULL)函数来的, 如果你点太快的话  生产的种子基本上一样,应该会影响你产生的随机数。

按自己的经验 只要相隔一秒以上  基本不得怎么这么频繁重复

论坛徽章:
26
处女座
日期:2016-04-18 14:00:4515-16赛季CBA联赛之深圳
日期:2020-06-02 10:10:5015-16赛季CBA联赛之广夏
日期:2019-07-23 16:59:452016科比退役纪念章
日期:2019-06-26 16:59:1315-16赛季CBA联赛之天津
日期:2019-05-28 14:25:1915-16赛季CBA联赛之青岛
日期:2019-05-16 10:14:082016科比退役纪念章
日期:2019-01-11 14:44:062016科比退役纪念章
日期:2018-07-18 16:17:4015-16赛季CBA联赛之上海
日期:2017-08-22 18:18:5515-16赛季CBA联赛之江苏
日期:2017-08-04 17:00:4715-16赛季CBA联赛之佛山
日期:2017-02-20 18:21:1315-16赛季CBA联赛之天津
日期:2016-12-12 10:44:23
发表于 2009-03-30 16:58 |显示全部楼层
没有什么真正可靠的随机数种子,这样的数字不是很随机么?

假如 产生 13个数字 1 ~13 都有了 那才不正常了呢 ~

论坛徽章:
0
发表于 2009-03-30 17:00 |显示全部楼层

论坛徽章:
323
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2009-03-30 17:02 |显示全部楼层
rand本身产生的就是伪随机数

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
发表于 2009-03-30 17:23 |显示全部楼层
你算一算3次取得的数字都不同的概率,就知道为什么了。

http://blog.codingnow.com/2008/04/quasi-random_sequences.html
http://blog.codingnow.com/2007/11/random.html

评分

参与人数 1可用积分 +2 收起 理由
jeanlove + 2 我很赞同

查看全部评分

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
发表于 2009-03-30 17:25 |显示全部楼层
另外,想取一个随机序列的话,仅初始化一次随机数发生器,然后使用这个发生器依次取出全部数字,这样得到的东西的分布才符合预期。

随机数发生器可没保证不同种子产生的第一个数的随机分布。

你这样用时间当随机种子并连续取第一个数值,相当于把一系列连续数字(如 123333 123334 123335)代入随机数公式,取得的数据没有相关性才怪。

[ 本帖最后由 shan_ghost 于 2009-3-30 17:29 编辑 ]

评分

参与人数 1可用积分 +2 收起 理由
jeanlove + 2 我很赞同

查看全部评分

论坛徽章:
0
发表于 2009-03-30 17:27 |显示全部楼层
原帖由 evaspring 于 2009-3-30 16:58 发表
没有什么真正可靠的随机数种子,这样的数字不是很随机么?

假如 产生 13个数字 1 ~13 都有了 那才不正常了呢 ~

嗯,但是我觉得,这样的序列
3,9,3,10,3,4,10,4,11,4

怎么看也不觉得随机做的多好,至少不应该让我看出上面我说的某种规律吧,呵呵。

论坛徽章:
0
发表于 2009-03-30 17:46 |显示全部楼层
原帖由 shan_ghost 于 2009-3-30 17:23 发表
你算一算3次取得的数字都不同的概率,就知道为什么了。

http://blog.codingnow.com/2008/04/quasi-random_sequences.html
http://blog.codingnow.com/2007/11/random.html

偶数学不精通,不过这个概率应该很高吧。

连续3张扑克牌,点数都不同的概率是不是
1*(12/13)*(11/13),这是个远远大于0.5的数字啊
同理,连续4张扑克牌,点数都不同的概率,还是0.6左右。

应该是大概率事件吧。

我尝试了一下,如果运行./a.out的时间间隔大一点,确实产生的数随机性好多了。
8,3,10,11,5,13,11,5,7,2,11,6,7,8,10

论坛徽章:
0
发表于 2009-03-30 17:47 |显示全部楼层
原帖由 shan_ghost 于 2009-3-30 17:25 发表
另外,想取一个随机序列的话,仅初始化一次随机数发生器,然后使用这个发生器依次取出全部数字,这样得到的东西的分布才符合预期。

随机数发生器可没保证不同种子产生的第一个数的随机分布。

你这样用时间 ...

这个解释有意思!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP