请问个随机数产生的有关问题

请教个随机数产生的问题
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

探讨

引用:
前两天刚刚讨论过,Rnd2次,并将结果转为5进制,如果>21,则舍弃,重新Rnd,否则的话,求Mod 7的结果。


在哪了 没看到啊:(
能给我link看看吗?
谢谢

------解决方案--------------------
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,概率也是均等的。


探讨
不好意思,
问一下:
为什么要rand两次?
为什么>21就舍弃?

------解决方案--------------------
随机数,有两个问题。
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 );
}