首页 > 解决方案 > 可能基于数百万骰子面的随机数生成器

问题描述

我正在尝试创建一个程序,旨在确定视频游戏角色可以控制多少个元素。在这种情况下,一般人群至少可以控制 1 个元素。但我希望每 1000 人中有 1 人可以控制 2 个元素,每 10,000 人中有 1 人可以控制 3 个元素,每 100,000 人中有 1 人可以控制 4 个元素。

该程序首先询问人口中有多少人。这将等于模具有多少面。然后,它循环遍历,生成随机数,然后输出多少人可以控制多少元素。

我遇到了一个我认为与我的数据类型有关的问题。即使我输入 1,000,000 的人口,循环也会迭代一百万次,但不会滚动超过 5 位数的数字。所以超过 99,999 的人口在技术上永远不会有 3 或 4 个元素。它似乎没有超过 50k ish,我记得读过其中一种数据类型只能处理 65k ish 数字。是这个原因吗?我应该使用哪些数据类型来滚动 0 到数百万之间的随机数?

#include <iostream>
#include <ctime>
#include <iomanip>

using namespace std;


int main()
{
    int min = 1, max, sides, roll;
    double oneCounter = 0.0, twoCounter = 0.0, threeCounter = 0.0, fourCounter = 0.0;

    unsigned long seed = time(0);
    srand(seed);
    cout << "How many characters would you like to generate?: ";
    cin >> sides;
    max = sides;

    cout << "\n";

    for (int i = 0; i < sides; i++)
    {
        roll = rand() % (max - min + 1) + min;

        if (roll % 100000 == 0)
        {
            cout << roll << ": You will have 4 elements" <<endl;
            fourCounter++;
        }
        else if (roll % 10000 == 0)
        {
            cout << roll << ": You will have 3 elements" <<endl;
            threeCounter++;
        }
        else if (roll % 1000 == 0)
        {
            cout << roll << ": You will have 2 elements" <<endl;
            twoCounter++;
        }
        else
        {
            cout << roll << ": You will have 1 element." <<endl;
            oneCounter++;
        }
    }

    cout << left;
    cout << "\n==============================" <<endl;
    cout <<setw(11) << "Potential"
         << setw(10) << "QTY"
         << setw(10) << "Pct"
         << endl;
    cout << "==============================" <<endl;
    cout << setw(11) << "Single: " 
         << setw(10) << oneCounter
         << setw(10) << (oneCounter/sides)*100 <<endl;

    cout << setw(11) << "Double: " 
         << setw(10) << twoCounter 
         << setw(10) << (twoCounter/sides)*100 <<endl;

    cout << setw(11) << "Triple: " 
         << setw(10) << threeCounter 
         << setw(10) << (threeCounter/sides)*100 <<endl;

    cout << setw(11) << "Quadruple: " 
         << setw(10) << fourCounter 
         << setw(10) << (fourCounter/sides)*100 <<endl;


    cout << "\n\n";
    return 0;
}

我已经包含了针对 100,000 人的人口(边)完成的结果的屏幕截图。概率看起来不错,但数字永远不会超过 5 位数。

在此处输入图像描述

标签: c++

解决方案


此问题与变量的类型范围无关,因为整数范围从 –2,147,483,648 到 2,147,483,647(使用 32 位编译器,请参见下面的评论)。

这里的错误是 rand() 函数只返回 stdlib.h 文件中定义的最大数字,即 32767。您应该使用标准随机库头来生成随机数。我建议看一下这个答案,看看如何轻松地做到这一点,如何在 C++ 中生成非常大的随机数

编辑:请参阅下面的 user4581301 的评论。我假设了 ints 类型范围,但在这里使用 long 可能是最安全的,以确保您尝试获取的大量数字可以适合变量。


推荐阅读