srand()、random()生成伪随机数的问题

poplv 2007-10-17 11:19:41
1.srand()、random()的实现在不同的开发环境中是不是不同?有没有srand()、random()在VC中的实现代码?

2.为什么要分为这两个部分?直接用一个函数生成随机数不行吗?比如生成随机种子不就是随机数吗?

3.random()的算法是一定的吧,如果这样种子一定生成的数就一定,对吧?既然输入确定,输出也确定的话,这样对产生随机数有什么意义呢?为什么不在random()中加入随机因素呢?

4.系统提供的函数srand()、random()是不是很简单?安全性如何?有无必要自己实现?有没有安全的方法?

5.产生100-300之间的随机数比产生100-200之间的随机数更安全,是不是这样?其安全性与哪些因素有关?

6.怎样对一种生成随机数的方法进行评估?有文章提到:“以时间为种子,生成100万个经过统计,重复的机率很大”,对结果的统计是怎么实现的?有无源代码?

问题比较多,回答的时候最好写上问题的序号,谢谢大家!
...全文
320 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
believefym 2007-10-22
  • 打赏
  • 举报
回复
随机是指一个序列之间可以看成是随机的,而不是同一个种子,去比较两个随机序列,序列由于算法相同,种子相同,肯定是一样的

关键是看一次随机序列元素与元素之间是不是有随机的意思就可以了
mathe 2007-10-22
  • 打赏
  • 举报
回复
1.不同,甚至相同环境下不同编译器都有可能使用不同(伪)随机函数。
2.因为是伪随机函数,而不是真正的随机数函数。主要是效率问题。如果要在计算机上产生真正的随机数,必然需要收集大量的随机信号,效率不会很高。
3.通常情况,伪随机产生数据已经足够好了,可用用来模拟大部分需要用随机数的场合。而不使用真正随机函数的因素很简单,效率问题。比如Windows下面CriptoAPI里面好像提供了真正的随机数函数,不过相对来说,效率肯定低很多。
4.非常简单,而且有些版本会有多线程不安全的问题。只是是否安全,看你用来做什么。一般情况没有自己实现的必要。如果你将随机函数用来产生密码之类的数据,那么就有可能给你提供了猜测密码的机会。安全性的问题同伪随机序列没有必然的联系。
5.基本相同。而且评测安全性同伪随机没有必然关系,是否安全往往是看你的同安全相关的算法是否有问题。
6.记录所有数据进行统计就行了。
lxbxl_17 2007-10-22
  • 打赏
  • 举报
回复
楼主 其实你的问题归根结底 就是一个问题
随机数函数为什么分 srand() 和 random()。其实就是要保证在相同的srand() 下 取得的 random()要相同。
至于为什么这样做
我举个例子 你可能就能明白了

2台机子玩扑克牌游戏
洗牌的时候只要 srand() 相同 那么 你用相同的代码 取得的 random()就相同 这样 2台机子的 牌就一样。
否则 你要保证一样 就得一台机子洗完牌后 把所有的牌都告诉另外一台通讯量就大很多了。
jixingzhong 2007-10-18
  • 打赏
  • 举报
回复
3.你得明白一点,用计算机,总得给一个算法,有了算法,有了初始状态,自然就是确定的。

有兴趣可以看看其他复杂的随机数生成算法。

4. 当然是简单的,它们是最简单的随机数生成算法。

5. 还有其他的算法可以使用,你可以看看去,有兴趣也可以实现一下。

6. 以时间为种子,生成随机数,然后统计就是了,参看:

#define RAND_MAX 0x7fff

int stat[RAND_MAX]={0};
srand(time(NULL));
for(int i=0; i<100w; i++) // 100w 是表示 100万这个数值,意思一下
stat[random()]++; //stat 统计
jixingzhong 2007-10-18
  • 打赏
  • 举报
回复
1.srand()、random()的实现在不同的开发环境中是不是不同?有没有srand()、random()在VC中的实现代码?
实现可能不同,
但是原理是一样的,【应该】都是最基本的线性随机,本人没有深究。


2.为什么要分为这两个部分?直接用一个函数生成随机数不行吗?比如生成随机种子不就是随机数吗?
这个就得看线性随机数原理了。

线性随机数, x(n+1) = a*x(n)+b
这是一个迭代公式,根据 x(0)就可以迭代获得一个序列,
而这个 x(0)就是种子,srand() 的作用就是设置这个 x(0),
random 则是根据这个种子生成序列的后续元素。
星羽 2007-10-17
  • 打赏
  • 举报
回复
大概就这样
星羽 2007-10-17
  • 打赏
  • 举报
回复


#define RAND_MAX 0x7fff

static unsigned long int next = 1;

int rand(void)
{
next = next * 1103515245 + 12345;
return (unsigned int)(next/(2 * (RAND_MAX +1L)) % (RAND_MAX+1L));
}

void srand(unsigned int seed)
{
next = seed;
}


64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧