【发布时间】:2011-08-19 00:10:44
【问题描述】:
我刚开始学习 C++,我正在尝试生成一个随机整数,即 1、2 或 3。我四处搜索,我看到的所有生成随机数的示例都令人困惑,并且总是与我上一个示例不同看着。有没有简单的方法来做到这一点?
【问题讨论】:
-
现在是接受答案的好时机,因为您得到了两个很好的答案,而对于这个简单的问题,您不会得到任何更好的答案。请注意,因为您自己解决了一个问题而放弃它只是一种不好的做法。
我刚开始学习 C++,我正在尝试生成一个随机整数,即 1、2 或 3。我四处搜索,我看到的所有生成随机数的示例都令人困惑,并且总是与我上一个示例不同看着。有没有简单的方法来做到这一点?
【问题讨论】:
模数解决方案是最直接的,但它通常会像“吃掉”结果的最低位的趋势一样失去模数的随机性。
更随机的方式是将 [0,1[ 以线性方式映射到 [a,b[ :
int roll(int min, int max)
{
// x is in [0,1[
double x = rand()/static_cast<double>(RAND_MAX+1);
// [0,1[ * (max - min) + min is in [min,max[
int that = min + static_cast<int>( x * (max - min) );
return that;
}
一个通用的版本是从这些微不足道的得到一个roll(T min, T max)版本。
【讨论】:
rand()返回RAND_MAX和x会变成1.0(所以范围实际上是[0,1] 包含)导致that超出函数的指定范围1。换句话说,roll(0,2)通常返回0或1,但偶尔会返回2。:)
试试这个:
srand(time(NULL));
int randNum = (rand() % 3) + 1; // you don't need the (...) surrounding rand() % 3 but it helps for clarity
这是通过将rand 函数的返回值除以三(可以是 0、1 或 2)再加一(得出 1、2 或 3)来实现的。
确保包含 cstdlib 和 ctime 标头。
另外,只调用一次srand,而不是每次生成随机数。
【讨论】:
<cstdlib>
编写一个 C++ 程序来生成 0 到 50 范围内的 25 个随机数。您应该使用队列将它们分组到类别中。输出程序示例如下图:
输出:
欢迎观看数据分类演示。 我们生成 25 个随机数,然后使用队列将它们分组。
分类数据: 24 7 31 23 26 14 19 8 9 6 43 16 22 0 39 46 22 38 41 23 19 18 14 3 41 数据分类结束
数据 0.. 9 : 7 8 9 6 0 3
数据 10..19 : 14 19 16 19 18 14
数据 20..29 : 24 23 26 22 22 23
29 岁以上的数据:31 43 39 46 38 41 41
【讨论】: