【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 5162|回复: 10

对伪随机数rand()的一点浅薄认识

[复制链接]
发表于 2006-6-23 15:04:44 | 显示全部楼层 |阅读模式

我们虚拟注入了30万的数据库用户。在灌入程序中,我用随机数来实现用户ID,用户名,密码的生成。

原来读到伪随机数,总是评价它产生的分布区域并不平均。但是我在使用灌入数据库的时候却意外的发现了一个不明显的数据规律,请看下表(是倒序,下面的是先注入的):

检索 编号: 57

***************************************
编号: 57 姓名: 2649 电话: 9121
***************************************
***************************************
编号: 57 姓名: 25398 电话: 25962
***************************************
***************************************
编号: 57 姓名: 10404 电话: 9647
***************************************
***************************************
编号: 57 姓名: 10404 电话: 9647
***************************************

检索 编号: 556

***************************************
编号: 565 姓名: 30746 电话: 2891
***************************************
***************************************
编号: 565 姓名: 26027 电话: 13056
***************************************
***************************************
编号: 565 姓名: 1052 电话: 15377
***************************************
***************************************
编号: 565 姓名: 1052 电话: 15377
***************************************
***************************************
编号: 565 姓名: 1052 电话: 15377
***************************************
***************************************
编号: 565 姓名: 1052 电话: 15377
***************************************
***************************************
编号: 565 姓名: 1052 电话: 15377
***************************************

是不是发现了有点不对劲,怎么会有很多ID 姓名,还有电话完全一样的人。开始我也不相信。因为采用的完全是随机数,但是这个问题是很显然的,就是随机数并不随机,而是有一定规律排布的。

当然以上规律并不是每一个数据都会这样,大部分的数据都很正常,只是偶尔会发现有这样的现象

 楼主| 发表于 2006-7-5 14:03:29 | 显示全部楼层
没有,就是简单的一个c语言的程序,简单到一个30w次的循环,注入rand()数.不过开始注入5000用户先测试了一下,再注入10w用户测试了一下,再注入30w用户。分了三次,结果就出现了这样的雷同用户,呵呵。这证明rand()的随机数是假的,是有规律的。所以采用rand()写赌博机的话,只要抓住规律就会每投必中。
发表于 2006-6-26 09:23:21 | 显示全部楼层
你是不是用了多线程??
发表于 2009-4-8 08:45:08 | 显示全部楼层
rand()的种子需要随即
发表于 2009-6-6 21:07:41 | 显示全部楼层
随机值都不随机,啊,怎么活啊还。
发表于 2009-7-31 09:19:09 | 显示全部楼层
QUOTE:
以下是引用xiangqx在2009-6-6 21:07:41的发言:
随机值都不随机,啊,怎么活啊还。

计算机里面没有真正的随机数,上面的现象很正常!是使用随机数的方法不对。

发表于 2009-11-13 11:32:57 | 显示全部楼层
恩,要先用srand();让种子随机,像srand(time(NULL));
发表于 2012-8-18 22:45:58 | 显示全部楼层
就像以上大家或的一样,C++中的随机数,如果要真是的实现每次不同的随机数,需要借助某种外界条件,比如用时间来取随机数可以得到不同的数组。
但是我有做个一个测试,不知道大家是否有注意过。当用srand(time(null))获取时间以后,在用rand%100限制随机数的时候。每次随机数的变化都是增加的。而且基本都是增加5、6、7这样。不会有很大的变化,而且我测试了很多次,都是不断的增加,没有减下来过。这个现象貌似也不能算真正的随机数了。有什么办法获取真正的随机数吗?完全的随机生成。
请各位指点。
发表于 2012-8-19 11:05:19 | 显示全部楼层
计算机里没有真正的随机数,所有的随机数都是靠公式算出来的。
记得《游戏编程精粹》里有一期专门讲了一篇关于获取游戏中物品概率的随机数文章。
使用随机数以前,首先要重置种子。养成好的习惯就是自己封装一个随机数函数,每次rand()之前都重新给srand赋值,当然最常见的是传入一个时间,因为srand()参数传的值一样,等到的随机数就一样。time()函数获取的是毫秒级的精度的程序运行时间值,想在两次执行获取相同的值的可能性为零,所以可以获取不同的随机数(伪随机数)。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-5-5 22:52

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表