您现在的位置: 天下网吧 >> 网吧天地 >> 天下码农 >> 微信小程序 >> 正文

关于随机数的讨论

2008-11-6cnblogs佚名

c中的rand()函数,能返回0到max int间的一个随机数,我认为在包含这个函数的库中,应该有一个静态变量保存它上一次得到的随机数,然后用这个数得到它的下一个随机数。
而且我认为一个产生随机数的算法,当它确定后,这个随机数序列就应该已经确定了,假设这个随机数序列是1到10的:1,3,5,2,6,9,7,10,4,8。这是一定的即通过给定一个种子,那个随机数的算法利用这个种子如4
则它一定得到下一个随机数8,我想这应该是确定的。
再说说它的伪随机性,如果把真实的随机数算法看成是一个股子,那么如果投出一个4点,那个再投的时候它应该有6中可能,且概率相等。如果投6次,那么应该有 6的6此方中组合,即可以认为是6的6次方个随机序列,那个一个随机数算法器相当于,取了这么多随机数序列中的一个。那么从整体上看,再加上你并不能预测一个数的下个个随机数是什么,所以可以认为这个随机序列是随机的的。

再谈谈一个随机数序列的一些特性,就是我认为不可能在两个不同的数上作用这个随机数发生器那么不可能,得到一个相同的数,而且我认为这个序列应该属于离散上的一种特殊的格:链,它具体的定义是对于集合中的任意两个数l1, l2,都有l1< l2,或l2 < l1。这里的小于号表示一种关系。如果用c++的一个成员函数来表示就是,l2.rand(l2)
 == l1,当然这个不一定是一种直接的关系,还可能通过一些间接的数如 l3.rand(l2.rand(l2)) == l1;
可以用一个图表来表示
9
/
6
/
2
/
3
/
5
/
1
/
7
/
10
/
4
/
8
如9>8, 9> 6, 4> 8等。
而不可能存在叉就是有,有两个数指向一个数,就是
9
/
6
/
2
/
5   3
/   /
1
/
7
/
10
/
4
/
8
5 >1,3 > 1,那么谁指向3呢,如是8以外的数指向它(8是最后的数,一会再讨论),如6那么这个6就有两个指向了2和3,不符合唯一性了。
而如果是8呢?那么就形成了一个3, 1, 7,10,4,8,3的小循环,排除了其他元素所以是不可能的。
 再说一下关于存在重复序列的问题,即如果有序列中4,4这个序列,4。rand(4) == 4,就会出现4循环永远是4了。

那么再回头看一下,再把回到开始的假设随机数发生器是rand()函数,能返回0到max int间的一个随机数,
那么它里面就不能有重复的序列,即对于一个数来说它的下一个数一定是一个非自身的数,那么和实际的随机数来说不是就有一个缺陷了吗?
而我昨天说用rand()%10 + 1,得到一个1到10的随机序列,它的间隔比较大,其实我的意思是重它的序列中你可以看到重复数的序列。这是因为如果在rand()的随机数序列中如果存在45,55,这个子序列,那么就得到了6,6序列有重复的子序列,而如果是35,78,就得到了6,9,可以看出6的下一个数在这种情况下是不确定的这当然是很好的。但是我想如果用直接打印rand()序列就不可能再出现相同的子序列。

那么会不会是rand()能产生更大的随机数然后在缩小到现在的这个去间呢,就像上面用rand()来生成一个1到10的随机序列,象这种比较好的随机序列。

欢迎访问最专业的网吧论坛,无盘论坛,网吧经营,网咖管理,网吧专业论坛 https://bbs.txwb.com

关注天下网吧微信/下载天下网吧APP/天下网吧小程序,一起来超精彩

本文来源:cnblogs 作者:佚名

声明
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系邮箱:support@txwb.com,系统开号,技术支持,服务联系QQ:1175525021本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧 网吧天下