当前位置: 技术问答>linux和unix
紧急!! rand_r函数生成的随机数怎么都是同一个数???
来源: 互联网 发布时间:2015-12-13
本文导语: 问题如标题, 代码如下: #include #include #include int main() { unsigned int a; int r = rand_r(&a); printf("r is:%dn", r); return 0; } | 理论上,无序的随机事件是无法用有序的程序来模拟的,当然rand/...
问题如标题, 代码如下:
#include
#include
#include
int main() {
unsigned int a;
int r = rand_r(&a);
printf("r is:%dn", r);
return 0;
}
#include
#include
#include
int main() {
unsigned int a;
int r = rand_r(&a);
printf("r is:%dn", r);
return 0;
}
|
理论上,无序的随机事件是无法用有序的程序来模拟的,当然rand/srand也不例外,它们只可以从一个起始数(用一个近似算法)连续推导出不同的数(这些数只能保证在整个样本空间是均匀分布的),但算法本身是固定的,如果起始数固定我们想就可以知道,结果数据序列一定是相同的序列。这种伪随机算法实际上不具有太大的现实意义,srand给你一种选择就是自己使用自己的起始数,这样如果起始数随机,那么随后产生的数也是随机的了。但寻找这样的起始数(随机种子)太困难。楼上提到用time秒数做随机数,如果你的程序不是固定在某个时刻启动,那么调用time的时刻就是随机的(是因为你运行该进程的时刻是随机的,这个才是真正的随机事件源)。现在很多主板有一个芯片(random number generator)用来产生随机数,这个就比较好,他可能定时向数据或地址总线去查询电信号,莱得到数值。使用/dev/接口可以读取。
|
在rand之前加上下面這一句
srand ((unsigned) time (NULL));
srand ((unsigned) time (NULL));
|
应该要初始化一下rand函数吧。
|
在rand之前加上下面這一句
srand ((unsigned) time (NULL));
也可以读/dev/random 或/dev/urandom 产生随机数
http://blog.chinaunix.net/u/6593/showart.php?id=150290
srand ((unsigned) time (NULL));
也可以读/dev/random 或/dev/urandom 产生随机数
http://blog.chinaunix.net/u/6593/showart.php?id=150290
|
srand()
要先用这个来产生随即数的种子
要先用这个来产生随即数的种子
|
说得够清楚了,这个问题在C版出现过很多很多。
|
顶一顶楼上的。:P
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。