对于rand_m 生成1到n的问题
今天在网上看到了在网上传的面试题,题目是:
int random_n(){int val = 0 ;int t; // t为n最大倍数,且满足 t <= m * mdo { val = m * (random_m() - 1) + random_m();} while (val > t);return val;}
?可以略微对val处理一下。
?
2012-03-01
?方法2:
例如Rand7会生成1,2,3,4,5,6,7这些数。我们以4为分界点。
如果生成1-3这3个数字时,我们在Rand7,只取1-5这几个数字。
如果生成5-7这3个数字时,我们在Rand7+3,只取5-10这几个数字。
?
?
方法3:
例如Rand7会生成1,2,3,4,5,6,7这些数。我们以4为分界点。
由于 rand7 是 1..7
rand7+3是 4..10, 直接返回结果时,4..7 的概率会多一倍
全局标志位 flag = 0; 记录每当出现再次4..7时才进行输出
1.如果生成1-3这3个数字时,我们在Rand7
?1.1如果生成1-3,直接输出
?1.2如果生成4-7,如果flag=0,?则置flag = 1,?再调用一次Rand10.
????????????????????????? flag = 1, 直接返回此值, flag = 0
?
2.如果生成5-7这3个数字时,我们在Rand7+3,只取5-10这几个数字。
?同理
?