给定1-N1的随机数,产生1-N2的随机数(典型:给定产生1-5的随机数,求1-7的随机数函数)

目录

1、问题定义

2、分下列两种情况进行讨论

情况一:若N1 >= N2时

情况二:若N1 < N2时

3、典型例题:给定产生1-5的随机数,求1-7的随机数函数


1、问题定义

已知有一个函数能够产生1-N1之间的的随机数(等概率),通过此函数将其改造成产生1-N2之间的随机数(等概率)。设randN1()为产生1-N1之间的随机数的函数,需要将其改造成randN2()。

2、分下列两种情况进行讨论

情况一:若N1 >= N2时

我们可以用一个例子来讨论这个问题,如给定的函数产生1-50之间的随机数,要将其改成生成1-15之间的随机数。则可以这样考虑,若要将1-50之间的数变为1-15之间的数只需要对15取余运算即可,但是50并不是15的整数倍数,因此无法保证等概率。我想你已经想到了解决办法,即取1-50之间15的最大整数倍数进行取余运算(即45),而大于45的数则舍弃并重新运算。

randN2(){
    if(randN1() > 45) return randN2();
    else return randN1() % 15 + 1;
}

情况二:若N1 < N2时

此时产生的随机数范围比要改造生成的随机数范围小,那么可以先对其进行范围扩大改造,具体方法如下:

1)构造式子(randN1() - 1 ) * N1,那么其变为生成0,N1,2N1,......,(N1-1)N1之间的数

2)再通过第一步的式子构造(randN1() - 1) * N1 + randN1(),那么会生成1 - N1^2之间的数

3)若N1^2 >= N2则可以参照情况一进行计算,否则返回步骤1)继续扩大构造成1 - (N1^2)^2之间的数,直至满足情况一

3、典型例题:给定产生1-5的随机数,求1-7的随机数函数

// 随机生成等概率1-5的函数实现
int random5() {
    int x = rand();   //调用随机函数
    if (x > 32000) return random5();
    return x % 5 + 1;  //1-5
}
// 由random5()构造 random7()
int random7() {
    int x = 5 * (random5() - 1) + random5();
    if (x > 21) return random7();  // 筛选的过程  
    return x % 7 + 1;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章