请问个随机数产生的有关问题
请教个随机数产生的问题
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
------解决方案--------------------
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
------解决方案--------------------
- C/C++ code
int f1(); // rand 0-a int 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,概率也是均等的。
------解决方案--------------------
随机数,有两个问题。
1.公式问题。其实只是一个简单的证明题而已,这里以Java的Math.random为例。其它语言请查阅手册,思路都一样。
A.设 x = Math.random( ),
∵ Math.random( ) ∈ [ 0, 1 ),
∴ x ∈ [ 0, 1 ).
B.设 n, m ∈ R,且 0 < n < m ,
∴ mx ∈ [ 0, m ) ,
∴ n + mx ∈ [ n, n + m ). ---> 公式一
公式一解决了求某个范围内随机数的问题。比如,求 [5, 13)之间的随x机 cx数,那么由:
(1).n = 5 ,
(2). n + m = 13 ,
解得:n=5, m=8,
代入公式,得: 5 + 8x ∈[5, 13);
即 5 + 8*Math.random( ) ∈ [5, 13) 。
负数部分同理,自己处理。
2.随机数种子问题。Java、PHP等高级语言一般不会有这个问题。这个问题只在低层语言出现,比如C和C++。原因自己百度。解决方法也很简单,那就是在调用随机数函数之前,先用系统时间来生成种子。
例子:
- C/C++ code
#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 ); }