免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: pmerofc
打印 上一主题 下一主题

[C] 初中级C语言水平自测:srand((int)time(0)); 有没有错? [复制链接]

论坛徽章:
0
91 [报告]
发表于 2012-10-14 01:46 |只看该作者
回复 86# pmerofc


举个例子吧。

一个很简单的猜数字游戏(事先声明:没有输入检查,只说明问题,不做教学用途,别批我)
  1. #include <stdio.h>
  2. #include <time.h>

  3. int main(int argc, const char *argv[])
  4. {
  5.         srand(time(0));
  6.         if (argc == 2)
  7.         {
  8.                 int number = rand() % 100;
  9.                 int guess;
  10.                 sscanf(argv[1], "%d", &guess);
  11.                 printf("number=%d, you guess %d, you %s.\n",
  12.                         number, guess, number==guess?"won":"lost");
  13.         }
  14.         return 0;
  15. }
复制代码
自己猜太麻烦了,让电脑自己玩吧。
  1. #!/bin/sh

  2. for ((n=0; i<100; i=i+1)) do
  3.         ./rand $i
  4. done
复制代码
最后一定可以猜中一个,原因自己看:

[root@localhost test]# vi rand.c
[root@localhost test]# vi guess.sh
[root@localhost test]# chmod +x guess.sh
[root@localhost test]# ./guess.sh
number=38, you guess 1, you lost.
number=38, you guess 2, you lost.
number=38, you guess 3, you lost.
number=38, you guess 4, you lost.
number=38, you guess 5, you lost.
number=38, you guess 6, you lost.
number=38, you guess 7, you lost.
number=38, you guess 8, you lost.
number=38, you guess 9, you lost.
number=38, you guess 10, you lost.
number=38, you guess 11, you lost.
number=38, you guess 12, you lost.
number=38, you guess 13, you lost.
number=38, you guess 14, you lost.
number=38, you guess 15, you lost.
number=38, you guess 16, you lost.
number=38, you guess 17, you lost.
number=38, you guess 18, you lost.
number=38, you guess 19, you lost.
number=38, you guess 20, you lost.
number=38, you guess 21, you lost.
number=38, you guess 22, you lost.
number=38, you guess 23, you lost.
number=38, you guess 24, you lost.
number=38, you guess 25, you lost.
number=38, you guess 26, you lost.
number=38, you guess 27, you lost.
number=38, you guess 28, you lost.
number=38, you guess 29, you lost.
number=38, you guess 30, you lost.
number=38, you guess 31, you lost.
number=38, you guess 32, you lost.
number=38, you guess 33, you lost.
number=38, you guess 34, you lost.
number=38, you guess 35, you lost.
number=38, you guess 36, you lost.
number=38, you guess 37, you lost.
number=38, you guess 38, you won.
number=38, you guess 39, you lost.
number=38, you guess 40, you lost.
number=38, you guess 41, you lost.
number=38, you guess 42, you lost.
number=38, you guess 43, you lost.
number=38, you guess 44, you lost.
number=38, you guess 45, you lost.
number=38, you guess 46, you lost.
number=38, you guess 47, you lost.
number=38, you guess 48, you lost.
number=38, you guess 49, you lost.
number=38, you guess 50, you lost.
number=38, you guess 51, you lost.
number=38, you guess 52, you lost.
number=38, you guess 53, you lost.
number=38, you guess 54, you lost.
number=38, you guess 55, you lost.
number=38, you guess 56, you lost.
number=38, you guess 57, you lost.
number=38, you guess 58, you lost.
number=38, you guess 59, you lost.
number=38, you guess 60, you lost.
number=38, you guess 61, you lost.
number=38, you guess 62, you lost.
number=38, you guess 63, you lost.
number=38, you guess 64, you lost.
number=38, you guess 65, you lost.
number=38, you guess 66, you lost.
number=38, you guess 67, you lost.
number=38, you guess 68, you lost.
number=38, you guess 69, you lost.
number=38, you guess 70, you lost.
number=38, you guess 71, you lost.
number=38, you guess 72, you lost.
number=38, you guess 73, you lost.
number=38, you guess 74, you lost.
number=38, you guess 75, you lost.
number=38, you guess 76, you lost.
number=38, you guess 77, you lost.
number=78, you guess 78, you won.
number=78, you guess 79, you lost.
number=78, you guess 80, you lost.
number=78, you guess 81, you lost.
number=78, you guess 82, you lost.
number=78, you guess 83, you lost.
number=78, you guess 84, you lost.
number=78, you guess 85, you lost.
number=78, you guess 86, you lost.
number=78, you guess 87, you lost.
number=78, you guess 88, you lost.
number=78, you guess 89, you lost.
number=78, you guess 90, you lost.
number=78, you guess 91, you lost.
number=78, you guess 92, you lost.
number=78, you guess 93, you lost.
number=78, you guess 94, you lost.
number=78, you guess 95, you lost.
number=78, you guess 96, you lost.
number=78, you guess 97, you lost.
number=78, you guess 98, you lost.
number=78, you guess 99, you lost.
[root@localhost test]#


哎呀,居然跨越秒,还猜中两次,这运气真是好。

论坛徽章:
0
92 [报告]
发表于 2012-10-14 01:48 |只看该作者
刚好在秒滴答的时候猜中一次,这运气真的是逆天了!

论坛徽章:
0
93 [报告]
发表于 2012-10-14 01:54 |只看该作者
本帖最后由 sonicling 于 2012-10-14 01:55 编辑

我说错了一个地方,一旦跨越秒,就不一定能猜中。

玩了多次,绝大多数情况下都没有跨越秒,好不容易出现了一次都没猜中的情况:
  1. number=70, you guess 59, you lost.
  2. number=70, you guess 60, you lost.
  3. number=9, you guess 61, you lost.
  4. number=9, you guess 62, you lost.
复制代码
前后就不贴了。

论坛徽章:
0
94 [报告]
发表于 2012-10-14 02:01 |只看该作者
本帖最后由 sonicling 于 2012-10-14 02:08 编辑
pmerofc 发表于 2012-10-14 00:00
如果seed数目少,序列的数目也少(这个是我们的分歧之所在吧)


序列数目少一半也不是什么问题。40亿的一半也有20亿,总是用不完的。

Update:而且每个序列都是无穷的。

唯一的问题就是陈记错了srand的参数类型,还特地转换成int,结果画蛇添足了。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
95 [报告]
发表于 2012-10-14 03:14 |只看该作者
本帖最后由 gvim 于 2012-10-14 03:28 编辑

回复 82# pmerofc


少不了,现在的rand算法是 n = n * 16807 mod 2147483647 实现都只需要31bit就可以了,因为2^31 - 1 = 2147483647 是梅森素数,最适合32和64位系统(下一个是2^67-1)。另外rand的幻数16807选择需要能遍历1 --- 2^31-1之间的所有数,并且一个连续的遍历周期内只能出现一次(虽然16807遍历出来的数之间的相关性相比有些幻数不是最好)。
所以参数 n , 也就是种子给多了也没用,只要是32位和64位的机器,给不给符号不影响随机数的随机性也不影响产生的序列长度(超不出1 --- 2^31-1之间),或者哪怕产生了所谓的UB,也不影响随机性,这里随机性的来源是取时间的随机。种子的随机性导致rand结果的随机性才是使用rand的意义,而不是参数 n符号的 正确与否(因为错误不影响随机性)。

当然,这个话题当作转型,溢出,UB的讨论是成功的,呵呵。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
96 [报告]
发表于 2012-10-14 05:27 |只看该作者
回复 94# sonicling


    我想知道seed少和数列少有什么关系………………

你给的是个unsigned,你哪怕给全0或者全1都能给你生成随机的数列,问题仅仅在于随机性不太一样。

如果seed非要达到多少bit的话,就不需要rand了,光seed自己的随机性就能保证一些应用了= =

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
97 [报告]
发表于 2012-10-14 08:21 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
98 [报告]
发表于 2012-10-14 08:28 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
99 [报告]
发表于 2012-10-14 08:32 |只看该作者
回复 97# pmerofc


    还是不对,因为srand的参数是unsigned,即使强制转换到int,也会最终转到unsigned,最终srand得到的数据量是一样多的。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
100 [报告]
发表于 2012-10-14 08:35 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP