首页
新闻
论坛
群组
Blog
文档
下载
读书
Tag
网摘
搜索
.NET
Java
游戏
视频
人才
外包
培训
数据库
书店
程序员
欢迎您:
游客
| 退出
| 登录
注册
帮助
我的帖子
我参与的帖子
我的空间
我的网摘
CSDN
CSDN社区
C/C++
新手乐园
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
生成帖子
置顶
推荐(加精)
取消推荐(加精)
锁定帖子
移动帖子
取消引用
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
关于随机数的问题
[已结贴,结贴人:hyh563948446]
加为好友
发送私信
在线聊天
hyh563948446
HYH
等级:
可用分等级:
贫农
总技术专家分:
3
总技术专家分排名:
271927
揭帖率:
80.00%
发表于:
2008-08-23 22:45:22
楼主
各位朋友
小弟想请教一个问题
在C语言中有个随机数和伪随机数
我不明白意思
麻烦各位朋友解释一下
随机数和伪随机数
谢谢!1
问题点数:
20
回复次数:
9
显示所有回复
显示星级回复
显示楼主回复
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
akirya
坏[其实偶不是什么所谓的坏人]
等级:
可用分等级:
富农
总技术专家分:
91562
总技术专家分排名:
59
6
发表于:
2008-08-23 22:48:41
1
楼 得分:
0
计算机生成的随机数都是伪的,不是真正的随机
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
wangdeqie
幸福在流浪
等级:
可用分等级:
中农
总技术专家分:
4689
总技术专家分排名:
5312
发表于:
2008-08-23 22:48:54
2
楼 得分:
20
1. 如何产生一定范围内的随机数?
直接的方法是:
rand() % N;
返回从 0 到 N - 1 的数字。但这个方法不好,因为许多随机数发生器的低位比特并不随机。一个较好的方法是:
(int)((double)rand() / ((double)RAND_MAX + 1) * N);
如果你不希望使用 double,另一个方法是:
rand() / (RAND_MAX / N + 1);
两种方法都需要知道 RAND_MAX,而且假设 N 要远远小于 RAND_MAX。ANSI 规定标准头文件 stdlib.h 中包含 RAND_MAX 的 #define。顺便提一下,RAND_MAX 是个常数,它告诉你 C 库函数 rand() 的固定范围。你不可以设 RAND_MAX 为其它的值,也没有办法要求 rand() 返回其它范围的值。如果你用的随机数发生器返回的是 0 到 1 的浮点值,要取得范围在 0 到 N - 1 内的整数,只要将随机数乘以 N 就可以了。
2. 为什么每次执行程序,rand() 都返回相同顺序的数字?
你可以调用 srand() 来初始化伪随机数发生器的种子,传递给 srand() 的值应该是真正的随机数,例如当前时间:
#include <stdlib.h>
#include <time.h>
srand((unsigned int)time((time_t *)NULL));
请注意,在一个程序执行中多次调用 srand() 并不见得有帮助!不要为了取得“真随机数”而在每次调用 rand() 前都调用 srand()!
3. 我需要随机的真/假值,所以我用直接用 rand() % 2,可是我得到交替的 0, 1, 0, 1, 0 。
这是个低劣的伪随机数生成器,在低位比特中不随机!很不幸,某些系统就提供这样的伪随机数生成器。请试着使用高位比特,具体请参考本文第 1 点。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
ga6840
学生学生学生学生学生
等级:
可用分等级:
乞丐
总技术专家分:
0
总技术专家分排名:
311804
发表于:
2008-08-23 23:20:13
3
楼 得分:
0
我学的高三数学就有一个随机数表
伪随机数 是根据随机数表 深成的
结果是有寻找规则的
要使执行有不同的结果
用time函数得到一个关于现在距开机时刻的毫秒数 来初始化随机数发生器的种子
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
bitxinhai
清风
等级:
可用分等级:
富农
总技术专家分:
1826
总技术专家分排名:
11714
发表于:
2008-08-24 09:15:41
4
楼 得分:
0
计算机生成的随机数都是伪的,不是真正的随机!!!
每次生成的数都是一样的,因为他们的种子一样,
使用时间作为种子就可以生产真正的随机数,
srand(time(NULL));
int a = rand(100);
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
qqwx_1986
球球
等级:
可用分等级:
中农
总技术专家分:
233
总技术专家分排名:
58528
发表于:
2008-08-24 09:19:12
5
楼 得分:
0
mark
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
k2eats
浩然正气 贵真求善
等级:
可用分等级:
富农
总技术专家分:
15427
总技术专家分排名:
983
发表于:
2008-08-24 09:35:33
6
楼 得分:
0
引用 4 楼 bitxinhai 的回复:
计算机生成的随机数都是伪的,不是真正的随机!!!
每次生成的数都是一样的,因为他们的种子一样,
使用时间作为种子就可以生产真正的随机数,
srand(time(NULL));
int a = rand(100);
就算用时间做种子,也不会产生真正的随机数,
计算机内只能产生“伪随机数”。
以下摘自百度百科:
伪随机数并不是假随机数,这里的“伪”是有规律的意思,就是计算机产生的伪随机数既是随机的又是有规律的。怎样理解呢?产生的伪随机数有时遵守一定的规律,有时不遵守任何规律;伪随机数有一部分遵守一定的规律;另一部分不遵守任何规律。比如“世上没有两片形状完全相同的树叶”,这正是点到了事物的特性,即随机性,但是每种树的叶子都有近似的形状,这正是事物的共性,即规律性。从这个角度讲,你大概就会接受这样的事实了:计算机只能产生伪随机数而不能产生绝对随机的随机数。(严格地说,这里的计算机是指由冯诺依曼思想发展起来的电子计算机。而未来的量子计算机有可能产生基于自然规律的不可重现的“真”随机数)
详见:http://baike.baidu.com/view/1127.htm
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
jia_xiaoxin
等级:
可用分等级:
贫农
总技术专家分:
612
总技术专家分排名:
38947
发表于:
2008-08-24 12:07:10
7
楼 得分:
0
因为C语言中的随机数是模拟产生的,所以叫伪随机数
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
nwpulei
再苦再累,就当自己是活受罪;再难再险,就当自己是二皮脸。
等级:
可用分等级:
中农
总技术专家分:
194
总技术专家分排名:
65215
发表于:
2008-08-24 12:15:15
8
楼 得分:
0
"伪随机数",用函数产生的.用同一个种子产生几个数字时,表面看起来是随机的.但是多了以后就会发现竟然会循.
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
wanfustudio
雁南飞
等级:
可用分等级:
乞丐
总技术专家分:
25398
总技术专家分排名:
409
2
2
发表于:
2008-08-24 12:16:04
9
楼 得分:
0
所谓伪随机数,是因为“随机数”都不是随机的,而是通过公式计算出来的
修改
删除
举报
引用
回复
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
网站简介
-
广告服务
-
网站地图
-
帮助
-
联系方式
-
诚聘英才
-
English
-
问题报告
北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
abc推荐给好友