0
点赞
收藏
分享

微信扫一扫

用rand4()实现rand6()

思考的鸿毛 2024-09-05 阅读 21

文章目录


你可以使用 rand4() 函数来实现 rand6(),通过以下方法来实现一个均匀分布的随机数生成器。

思路

rand4() 函数生成一个范围在 [1, 4] 的随机整数,而我们需要生成一个范围在 [1, 6] 的随机整数。直接使用 rand4() 是无法直接得到 [1, 6] 范围的数字的,因此需要进行一些额外的步骤。

我们可以通过组合多个 rand4() 的结果来扩大随机数的范围,然后再将其映射到 [1, 6] 的范围内。

实现方法

  1. 使用 rand4() 生成两个随机数,然后将它们组合成一个范围在 [1, 16] 的数字。
  2. 如果生成的数字落在 [1, 6] 范围内,直接返回;否则,重新生成,直到得到 [1, 6] 范围内的数字。
#include <iostream>
#include <cstdlib> // 包含rand()和srand()
#include <ctime>
#include <vector>   // 包含time()

#define COUNT 10000

// 假设有一个rand4()函数,生成[1, 4]范围内的随机数
int rand4() {
    return rand() % 4 + 1;
}

// 使用rand4()实现rand6()
int rand6() {
    while (true) {
        // 生成[1, 16]范围内的随机数
        int num = (rand4() - 1) * 4 + rand4();
        // 如果落在[1, 6]范围内,直接返回
        if (num <= 6) {
            return num;
        }
        // 否则重新生成
    }
}

int main() {
    // 初始化随机数种子
    srand(static_cast<unsigned int>(time(nullptr)));

    std::vector<int> arr(7);

    // 测试rand6()
    for(int i=0;i<COUNT;i++) {
        int num = rand6();
        arr[num]++;
    }

    for(int i=0;i<6;i++) {
        std::cout<<"number1->"<< arr[i+1] <<std::endl;
    }

    return 0;
}

代码解释

  1. 组合 rand4() 结果:
  • (rand4() - 1) * 4 + rand4() 生成一个 [1, 16] 范围内的随机数。(rand4() - 1) * 4 生成 0, 4, 8, 12 四个基数,然后加上另一个 rand4() 的结果,最终得到 [1, 16] 的均匀分布。
  1. 过滤结果:
  • 如果生成的数字在 [1, 6] 范围内,直接返回;否则,丢弃当前数字并重新生成,直到生成的数字在 [1, 6] 范围内。

rand4() 乘以 rand4()为什么不行?

使用 rand4() 乘以 rand4() 生成一个 [1, 16] 范围内的数字,是不合适的,因为这样会导致结果的分布不均匀。这是由于乘法运算对随机数的分布影响较大,具体来说,它会导致某些结果出现的概率更高,而其他结果的概率更低,从而破坏了均匀分布的特性。

举报

相关推荐

0 条评论