请教个随机数产生的问题
Write a method to generate a random number between 1 and 7, given a method that generates a random number between 1 and 5.
请大侠们指点
谢谢
[解决办法]
别说LZ了,我自己搜索了1个小时才找到,有时候自己回帖太多了,找起来也真是个问题。
http://topic.csdn.net/u/20100301/19/823341CD-F34A-44E6-B11C-3A857BC0A677.html
int f1(); // rand 0-aint f2(int b) // rand 0-b{ int res; int bigbits = (a + 1) * (a + 1) - (b + 1)) / (b + 1); while( (res = f1() * (a + 1) + f1()) > (bigbits * (b + 1) + b) ) return res / (bigbits + 1);}
[解决办法]
Random一次可以得到0-4的整数(+1后转化为1-5),
Random两次,把2次的结果按照5进制来排,可以得到一个0-24的整数,并且这24个数获得的概率均等
由于24 mod 7不等于0,因此存在概率分配不均的情况,也就是说0-24中,
mod 7 = 0 的数有4个
mod 7 = 1 的数有4个
mod 7 = 2 的数有4个
mod 7 = 3 的数有4个
mod 7 = 4 的数有3个
mod 7 = 5 的数有3个
mod 7 = 6 的数有3个
舍去21,22,23,24之后,mod 7为n的数就都是3个了。因此再取Mod 7,获取0-6的数的概率就是均等的了。
+1后转为1-7,概率也是均等的。
#include<time.h> /*使用time(NULL)函数*/#include<stdio.h>int rad();int radint=0;int main( void ){ long i; int k; clrscr(); for( i=1; i<=100; i++ ){ k=rad( ); printf( "%d\t", k ); } getch( ); return 0;}/*得到一个随机数*/int rad( ){ radint++; srand( time( NULL ) + radint ); /*用时间来生成种子*/ return ( rand( ) % 5 );}