首页 > 试题广场 >

给定能随机生成整数 1 到 5 的函数,写出能随机生成整数

[问答题]
给定能随机生成整数 1 到 5 的函数,写出能随机生成整数 1 到 7 的函数。
推荐
流头像
int rand7()
{
    int n=25;
    while(n>21){
        n=5*(rand5()-1)+rand5();
    }
    return (n%7)+1;
}
编辑于 2015-01-28 16:13:46 回复(5)
详细分析的一篇博客:
http://blog.csdn.net/yiqiangeliyou/article/details/46823595
发表于 2015-08-17 12:04:23 回复(0)
return (rand5-1)*6/4 + 1
发表于 2015-09-03 21:55:13 回复(1)

//假设rand5能随机生成1~5的5个数(均等概率),利用rand5生成rand7() 1~7(均等概率)

//1. 利用rand5求出rand2(),当rand5生成的数大于2时,一直循环,直到它生成的数为1或者2,且生成1和2的概率均为1/2,因为生成1和生成2的//概率是相等的。

//2. 利用rand2生成0和1(减1即可),连续使用三次,共有8种可能(二进制表示):000 001 010 011 100 101 110 111,当生成的数为000时,重新计算,这样就可以得到1~7范围内的数,且概率是均等的。

  1. #include <iostream>   
  2. #include <math.h>   
  3.   
  4. using   namespace  std;  
  5.   
  6. int  rand5()  
  7. {  
  8.     return  rand()%5+1;  
  9. }  
  10.   
  11. int  rand2()  
  12. {  
  13.     int  temp;  
  14.     do    
  15.     {  
  16.         temp = rand5();  
  17.     } while  (temp > 2);  
  18.   
  19.     return  temp;  
  20. }  
  21.   
  22. int  rand7()  
  23. {  
  24.     int  temp;  
  25.     do    
  26.     {  
  27.         temp = (rand2()-1)<<2;  
  28.         temp += (rand2()-1)<<1;  
  29.         temp += rand2()-1;  
  30.     } while  (temp == 0);  
  31.   
  32.     return  temp;  
  33. }  

发表于 2015-10-22 10:45:24 回复(0)
int rand7()
{
  int i;
  do{

i=5*(rand5()-1)+rand5();
}while(i>21);
return  i%7+1;
}
生成随机数的一个前提是等概率的生成,因此必须要确保生成等概率。i=5*(rand5()-1)+rand5();生成(1-25)都是等概率的为1/5*1/5=1/25的概率,通过while(i>21)等概率的生成(1-21),其概率都是1/25,这时其压缩范围为(1-21),则(1-21)的概率分别为1/21,返回的return  i%7+1;(1-7 )的概率都是1/7。
发表于 2015-09-04 20:00:27 回复(0)
这道题其实就是把区间为x=[1,5]转换成区间为y=[1,7]的,所以 y=(x-1)*3/2+1,是吧✪ω✪
发表于 2018-01-29 12:57:22 回复(0)
int rand7() {
    int i = rand5() - 1; // 随机生成0~4的数
    int j = rand5() - 1; // 随机生成0~4的数
    int num = 5 * i + j; // 随机生成0~24的数
    if(num > 20)
         return rand7();
    else
         return num % 7 + 1;

发表于 2015-08-29 14:18:32 回复(3)
目标是用rand5()产生rand7()随机数,如果我们能得到0到6的随机数的数,然后再加1那不就能的到1到7的随机数了么
我们利用余数,如果能到到0到6的随机余数就可以了
int rand7()
{
int x=(rand5()-1)*5+rand5();
if(x>21)
return rand7();
return x%7+1;
}

编辑于 2017-07-07 11:12:24 回复(0)
int rand7(){
     do{    
     value = (rand5()-1) * 5 + (rand5()-1)
     }while(value>=21)
    return value % 7 + 1;
}
受这位大神的启发,进行的修改
来源:牛客网

产生指定范围内的随机数就要求指定范围内每个数的产生概率都是相等的。
由于无法直接通过rand7()产生1-10的数,所以就要思考如何组合rand7()生成1~10n之间的数。
为了讨论方便,更符合我们平时使用的习惯,我们将rand7() - 1,就表示生成的是0~6之间的随机数。
i = rand7() - 1, j = rand7() - 1
那么7 * i + j 就可以看出一个7进为制的数范围 00~44(转换为十进制就是0~24),而且这些5进制数的产生概率都是一样的,每个数都是1/25,所以我们取0~20的这21个数,它们的概率也是相同的。余7加1就实现了rand7()。

可推广至更加一般的情况,对于利用可以产生1~N的随机数ranN(),生成1~M的随机数,只需要满足  MAX((randN()-1) * N + (randN()-1)) >= M都可以使用以上述方法类似的方法实现。
令 n = N-1
 (randN()-1) * N + (randN()-1) 将以等概率生成N进制数 0  ~nn (换成十进制为 (N-1)*10 + (N-1))。 为了让新生成的随机数等概率,
只取前0 ~ (M*k-1) 个数(M*k-1<  nn均可
余M + 1  求得 randM()随机数
编辑于 2017-05-28 11:36:53 回复(0)
 return (3*rand5()-1)/2;
这样的解法有错吗,如果不正确,那么错在哪里?
发表于 2016-08-11 10:55:44 回复(1)
public class Random{
public static int rand1To5(){
return (int)(Math.random()*5)+1;
}
public static int rand1To7(){
int rdm=0;
do{
rdm=(rand1To5()-1)*5+(rand1To5()-1);
}while(rdm>20);
return rdm%7+1;
}
public static void main(String[] args){
System.out.println(rand1To7());
}
}
发表于 2016-08-09 10:16:40 回复(0)
跟15题原理一样一样的
发表于 2016-03-27 11:13:42 回复(0)
&lt;div&gt; rand5()%2+6+rand5() &lt;/div&gt; &lt;div&gt; 假设rand5()为能生成整数1到5的函数 &lt;/div&gt;
发表于 2015-09-01 16:57:05 回复(0)
n取值范围[0,56]去除掉56;剩下的求余
intrand7()
{
    intn=56;
    while(n>55){
        n=11*rand5()+3*rand5();
    }
    returnn%7;
}
发表于 2015-08-31 11:15:06 回复(0)
觉得应该把循环条件改成n>20;只要n<=20就退出循环(只取0-20这21个数),0-6,7-13,14-20,每段中的数出现概率都相同,各段概率相同,所以n落在任何一段做n%7都会均匀的生成0-6,于是总的生成数为0-6的概率相同。
发表于 2015-08-30 13:44:05 回复(0)
<div> 此题的思路与前面题的思路一致,先给出代码: </div> <pre class="prettyprint lang-cpp">int rand5();//均匀的返回1~5的随机数 int rand7() { int t1, t2, t=0; t1 = rand5(); t2 = rand5(); t = (t1 - 1) * 5 + t2; while (t &gt; 21 || t &lt; 1) { t1 = rand5(); t2 = rand5(); t = (t1 - 1) * 5 + t2; } return ((t - 1) / 3 + 1); }</pre> <div> 首先<span></span>t = (t1 - 1) * 5 + t2;能够均匀的获得1~25的随机值,如果我只取1~21,那么对于t(1~21)来说,生成概率为1/21,那么返回值就是均匀的返回1~7了<span></span> </div> <div> <br /> </div> <div> <br /> </div>
发表于 2015-08-29 18:01:48 回复(0)
应该把答案的n>21改为n>19
发表于 2015-08-29 10:21:43 回复(1)
int temp1 = 0, temp2 = 0;
do{
	temp1 = rand5();
}while(temp1>4);
do{
	temp2 = rand5();
}while(temp2 > 3);
return temp1 + (temp2-1);

发表于 2015-08-08 22:17:53 回复(0)
设随机生成1~5的函数为f5(),1~7的函数为f7()。
利用二进制生成1~7的随机数,那么我需要随机生成001、010、100、101....111,每个位上的二进制我用f5()%2随机生成0或1,此时会出现000的情况,当出现000的情况时,我重新计算
int f7(){
  int temp = 0;
  while(temp==0){ //当随机生成的数为0的时候,重新计算,否则输出
    int cal = 1;
    temp = f5()%2;//初始最低位的值
    while(cal>=3){
      temp=temp<<2+(f5()%2);
      cal++;
   }
  }
  return temp;
}

发表于 2015-04-07 20:19:08 回复(1)


int rand5(){

    return rand()%5 + 1;

}


int rand7(){

    int temp;

    do{

        temp = (rand5()-1)*10+rand5()-1;

    

    }while (temp>12 || temp==0) ;

   

    switch (temp) {

        case 12:

            return 7;

            break;

        case 11:

            return 6;

            break;

        case 10:

            return 5;

            break;

        default:

            return temp;

    }

}


int main(int argc, const char * argv[]) {

    int a[7];

    int rand;

    for(int i=0;i<7;i++){

        a[i]=0;

    }

    for (int i=0; i<1000; i++) {

        rand = rand7();

        a[rand-1]++;

        //printf("%d\n",rand);

    }

    for (int i=0; i<7; i++) {

        printf("[%d] %d\n",i+1,a[i]);

    }

    return 0;

}



把1-7看成5进制数
发表于 2015-03-20 11:27:03 回复(0)
rand()*5 rand()*7
发表于 2014-12-12 16:25:37 回复(0)