c++ - 可能基于数百万骰子面的随机数生成器
问题描述
我正在尝试创建一个程序,旨在确定视频游戏角色可以控制多少个元素。在这种情况下,一般人群至少可以控制 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 位数。
解决方案
此问题与变量的类型范围无关,因为整数范围从 –2,147,483,648 到 2,147,483,647(使用 32 位编译器,请参见下面的评论)。
这里的错误是 rand() 函数只返回 stdlib.h 文件中定义的最大数字,即 32767。您应该使用标准随机库头来生成随机数。我建议看一下这个答案,看看如何轻松地做到这一点,如何在 C++ 中生成非常大的随机数
编辑:请参阅下面的 user4581301 的评论。我假设了 ints 类型范围,但在这里使用 long 可能是最安全的,以确保您尝试获取的大量数字可以适合变量。
推荐阅读
- c# - 成员名与类名相同
- python-3.x - 如何仅在存在 Web 元素时单击按钮?
- hive - 配置单元中的 Regex_extract 以提取日期
- angular - 如何在 Angular 5、6 或 7 的移动视图中显示 PDF?
- c# - 运行状况检查响应缺少 .json 扩展名
- laravel - 如何在一张表中保存许多记录 Laravel Eloquent(无关系)
- python - tsFresh - 给定的 id 列在数据中不存在
- c# - 无法从 oracle 存储过程中获取布尔值
- batch-file - 批处理两个有一个字母差异的WAV文件?
- windows - 从 cmd 脚本打开另一个 cmd 脚本而不打开新窗口