免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
41 [报告]
发表于 2012-09-28 01:53 |只看该作者
个人感觉还是要有事先的预防措施,今年黑帽大会上推荐的一本书叫"The Art of Software Security Assessment: Identifying and Preventing Software Vulnerabilities",书里介绍了C语言本身存在的安全问题,有兴趣的朋友可以翻一翻。
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4. #include <limits.h>

  5. int main(void) {
  6.         int i;
  7.         float f1;

  8.         /* initialize fl */
  9.                 f1 = time(NULL);
  10.                   if (f1 > (float) INT_MAX || f1 < (float) INT_MIN) {
  11.                        /* Handle error */

  12.                    } else {
  13.                            /* Seed the random-number generator with current time so that
  14.                                       * the numbers will be different every time we run.
  15.                                       */
  16.                            srand( (int)time( 0 ) );//srand( (unsigned)time( NULL ) );
  17.                    }

  18.            /* Display 10 numbers. */
  19.            for( i = 0;   i < 10;i++ )
  20.               printf( "%6d\n", rand() );

  21.            return 0;
  22. }
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
42 [报告]
发表于 2012-09-28 02:34 |只看该作者
41楼代码自己写的吗?你这个有两个错误:

1. 可能导致srand未初始化。
    曾经碰到一个系统,srand未初始化,rand()每次返回一样的值,连随机数都出不来。

2. 两次time(0)返回的值可能不同,上一次不能作为判定依据

论坛徽章:
0
43 [报告]
发表于 2012-09-28 02:44 |只看该作者
本帖最后由 isaacxu 于 2012-09-28 05:40 编辑

回复 42# 群雄逐鹿中原
烦请帮忙改改,因为要是直接用f1的话,随机种子就是定的了,再加上计算的方法不变,那下一次运行时的结果就会与上次相同。现在由于没有设定随机种子,那么在默认情况下随机种子来自系统时钟,二次运行的结果还是不同的。此外,现在这样也许能保证不会由于系统的问题导致溢出,但无法保证绝对不会溢出。
还麻烦告知可能出问题的系统,现在的程序只是在ubuntu12.04,Xubuntun12.04,Cloudera提供的ubuntu10.10,Win7四个系统下测试运行通过,其它许多系统下的运行情况都不太清楚,如能告知,万分感谢。


   

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

论坛徽章:
0
45 [报告]
发表于 2012-09-28 14:03 |只看该作者
回复 44# pmerofc
试试这里


   

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
47 [报告]
发表于 2012-09-28 21:51 |只看该作者
isaacxu 发表于 2012-09-28 02:44
回复 42# 群雄逐鹿中原
烦请帮忙改改


修改如下

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <time.h>

  4. int main(void) {
  5.     int i;

  6.     srand( time( 0 ) );

  7.     /* Display 10 numbers. */
  8.     for( i = 0;   i < 10;i++ )
  9.         printf( "%6d\n", rand() );

  10.     return 0;
  11. }
复制代码

论坛徽章:
0
48 [报告]
发表于 2012-09-28 22:37 |只看该作者
回复 47# 群雄逐鹿中原
多谢指教


   

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
49 [报告]
发表于 2012-09-29 13:44 |只看该作者
回复 18# zylthinking


    嗯, 这个我支持你的.

    UB UB, 管你怎么UB, C程序员至少还是能把握内存的. UB真恐怖到绝对的UB了, 艹, C语言不用混到今天了.

    不过我还是表示学习了,... 知道了浮点转整型如果超出range是UB而已. 溢出也是UB, 以前我从来没把溢出截断什么的当回事. 嗯, 好吧, 现在知道了, UB(弱弱地问截断也是UB吗哈哈, 比如int截断为short我可是从来都认为那是具有确定行为的东西, 这玩意应该不是UB罢? 这也是UB的话那我在标准派看来这些年又白混了...). UB那又怎么样, 拿本贴的例子来说, 你的说法我完全赞同.

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP