http://www.mitbbs.com/article_t/Quant/31188147.html
基本方法就是产生一串序列 1,4,5,3,2,4 然后前后两两划分为一组,比如(1,4),(5,3),因为总共有5X5 =25种等概率的可能,不能被7整除,可以拿掉4种,这样剩下21种,编号为#1,#2,...#21 如果出现#1,#2,#3则输出1,....如果出现#19,#20,#21则输出7,如果出现了被拿掉的那4种情况则忽略之 |
算法思路是:1. 通过 rand5()*5+rand5() 产生 6 7 8 9 10 11 …… 26,27 28 29 30 这25个数,每个数的出现机率相等2. 只需要前面 3*7 个数,所以舍弃后面的4个数3. 将 6 7 8 转化为 1,9 10 11 转化为 2,……,24 25 26 转化为 7。公式是 (a-3)/3
1 int rand7() 2 { 3 int a; 4 while( (a=rand5()*5+rand5()) > 26 ); 5 return (a-3)/3; 6 }
|