Chinaunix

标题: 取个1-100间的随机数. [打印本页]

作者: pandaiam    时间: 2013-05-10 17:10
标题: 取个1-100间的随机数.
如题,
我先从 /dev/random 取个随机数,
然后再 %100, 这样行吗, 这个取余的动作会破坏这种随机性吗..

数学不行,不会分析啊..
作者: hellioncu    时间: 2013-05-10 17:32
读到的是0-255,那么应该  (n * 100) / 255,由于结果被取整了,还是有损失的
作者: cokeboL    时间: 2013-05-10 17:42
本帖最后由 cokeboL 于 2013-05-10 17:43 编辑

n < 100 的 n+1;
100 <= n < 200 的 n-99;
n >= 200 的扔掉接着取。

不知道行不
作者: pandaiam    时间: 2013-05-10 18:08
晕,
我是定义了个 unsigned int, 不是读char..
所以这个数会比较大.
作者: linux_c_py_php    时间: 2013-05-10 19:46
rand()不行吗, 再说是读/dev/urandom。
作者: shang2010    时间: 2013-05-10 21:24
cokeboL 发表于 2013-05-10 17:42
n < 100 的 n+1;
100 = 200 的扔掉接着取。


主意可行, 不错。。。。要是阅卷老师给分少于60,应该给老师打屁股
作者: hellioncu    时间: 2013-05-10 21:43
shang2010 发表于 2013-05-10 21:24
主意可行, 不错。。。。要是阅卷老师给分少于60,应该给老师打屁股


这主意还不错?要我肯定打不及格,要是产生的随机数总是>200,理论上存在死循环
作者: hellioncu    时间: 2013-05-10 21:43
pandaiam 发表于 2013-05-10 18:08
晕,
我是定义了个 unsigned int, 不是读char..
所以这个数会比较大.


那样的话 %100对随机性影响不大
作者: shang2010    时间: 2013-05-10 22:14
hellioncu 发表于 2013-05-10 21:43
这主意还不错?要我肯定打不及格,要是产生的随机数总是>200,理论上存在死循环


杞人忧天,,,有一点性能问题可以根据具体情况规避掉的
作者: cokeboL    时间: 2013-05-10 23:04
回复 7# hellioncu

如果理论上存在死循环,那随机这东西应该也理论上存在高频、低频,那样实际应用就不是随机了,比如彩票,天天开那几组号码,问题也严重
作者: cokeboL    时间: 2013-05-10 23:05
回复 9# shang2010


    同意,比如连续取多少次都失败就取个指定数
作者: hellioncu    时间: 2013-05-10 23:10
cokeboL 发表于 2013-05-10 23:04
回复 7# hellioncu

如果理论上存在死循环,那随机这东西应该也理论上存在高频、低频,那样实际应用就不 ...


怎么说呢,我的原则是外部给你合法的数据,你的代码不能出问题
作者: cokeboL    时间: 2013-05-10 23:11
本帖最后由 cokeboL 于 2013-05-10 23:15 编辑

我觉得各种随机问题,没必要追求绝对的数学上的平均,理论在实际表现还是基于统计值;而不管采用什么算法,也

逃离不了世间万物的联系这一本质,所以数学上计算概率差不多就行。经典物理再经典,到了微观还是得搞量子力学,

因为我们的工具受限,有测不准原理
作者: cokeboL    时间: 2013-05-10 23:14
回复 12# hellioncu


那比如连续取多少次都失败就取个指定数

就可以避免死循环,就像异常处理,有的错误,没办法解决,干脆就来硬的,强制到某状态,至少保证了系统运行不会挂,
而且表面看来,运行良好
作者: bruceteen    时间: 2013-05-11 08:40
好像是 (int)( 100 * rand()/(RAND_MAX+1.0) ) + 1 吧
rand()/(RAND_MAX+1.0) 的范围是 [0.0,1.0)
100 * rand()/(RAND_MAX+1.0) 的范围是 [0.0,100.0)
(int)( 100 * rand()/(RAND_MAX+1.0) ) 的范围是 [0,99]
(int)( 100 * rand()/(RAND_MAX+1.0) ) + 1 的范围是 [1,100]

hellioncu 发表于 2013-05-10 21:43
这主意还不错?要我肯定打不及格,要是产生的随机数总是>200,理论上存在死循环

顶一下!
作者: folklore    时间: 2013-05-11 09:23
回复 1# pandaiam


    this Q has no A. the promble is that what is the RANDOMIZE that you require.

if the RANDOMIZE is just what you awared. then, don't do mathmatic evaluation between the randomize number may help to keep its destribution(i think what you want is keep the randomize number's distribution).

the following is bad instance:
int a =rand();
int b =rand();

int c =a+b;  // <<-- destribution destoried here
int d =a*b;  //  << -- destribution destoried here
int e =a*1000.0 /73.0;  // << -- destribution destoried here

good lucky
作者: yulihua49    时间: 2013-05-11 15:10
pandaiam 发表于 2013-05-10 17:10
如题,
我先从 /dev/random 取个随机数,
然后再 %100, 这样行吗, 这个取余的动作会破坏这种随机性吗..

a=radom%100+1;
作者: Sevk    时间: 2013-05-17 11:29
提示: 作者被禁止或删除 内容自动屏蔽
作者: folklore    时间: 2013-05-17 20:50
回复 18# Sevk


    X,假设楼主要求平均分布。 再假如样本是平均分布的,则

0~255 有机率
1,1,1,.... 1 (256个绝对平均)

你这样一算,分布变成以下类似的东西:

2,3,2,3,2,3,2,3.... 3




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2