【问题标题】:Generate Random Numbers between 10 and 65生成 10 到 65 之间的随机数
【发布时间】:2015-11-27 14:58:51
【问题描述】:

我希望我的程序生成 500 个随机数,范围为 10 到 65。我该怎么做?
目前,我的程序生成 0 到 74 个随机数。 而且,似乎我的最高和最低值不是读取随机生成的数字而是读取它的范围。 这是我的代码:

#include<iostream>
#include<exception>
#include<stdlib.h>   
using namespace std;

int main(){
    int year;
    int nextLine = 20;
    int highestValue = 0;
    int lowestValue = 0;
    int ages[500];
    int range = 65;

    cout << "Enter year today: ";
    cin >> year;
    srand(year);

    cout << "The ages are: \n";
    for (int i = 0; i < 500; i++){
        ages[i] = rand() % 65 + 10;
        cout << ages[i] << " ";

        if (i + 1 == nextLine){
            cout << "\n";
            nextLine += 20;
        }
    }

    for (int j = 0; j < 500; j++){
        if (ages[j] > highestValue)
            highestValue = ages[j];

        if (ages[j] < lowestValue)
            lowestValue = ages[j];
    }

    cout << "\nRange(HV-LV): " << highestValue << " - " << lowestValue << " = " << highestValue - lowestValue;

    system("pause>0");
    return 0;
}

编辑: 这是一个包含范围的工作代码。 :)

#include<iostream>
#include<exception>
#include<algorithm>
using namespace std;

int main(){
    int year;
    int nextLine = 20;
    int highestValue;
    int ages[500];
    int lowestValue;
    int range = 65;

    cout << "Enter year today: ";
    cin >> year;
    srand(year);

    cout << "The ages are: \n";
    for (int i = 0; i < 500; i++){
        ages[i] = rand() % 56;
        ages[i] += 10;
        cout << ages[i] << " ";

        if (i + 1 == nextLine){
            cout << "\n";
            nextLine += 20;
        }
    }

    highestValue = *max_element(ages, ages + 500);
    lowestValue = *min_element(ages, ages + 500);

    cout << "\nRange(HV-LV): " << highestValue << " - " << lowestValue << " = " << highestValue - lowestValue;

    system("pause>0");
    return 0;
}

【问题讨论】:

  • 在 C++11 中,std::uniform_int_distribution&lt;int&gt; distribution(10,65); 可能会有所帮助。

标签: c++ random


【解决方案1】:

您的原始代码没有产生您想要的结果有两个原因。

1) ages[i] = rand() % 65 + 10; 应该是 ages[i] = rand() % 56 + 10;

但你已经知道了:)

2) 当你计算你的最低值时,你设置了int lowestValue = 0;,但是在你的测试中

if (ages[j] < lowestValue)
    lowestValue = ages[j];

您可以明显看到,您的年龄值都不会小于零,因此lowestValue 永远不会更新。但是,如果您检查您的打印输出,它会显示您的值实际上都不低于 10。

如果您以int lowestValue = std::numeric_limits&lt;int&gt;::max() 而不是int lowestValue = 0 开头并包含#include &lt;limits&gt;,您应该会得到预期的结果。

这就是为什么您在使用 min_elementmax_element 时没有看到问题的原因 :)

【讨论】:

    【解决方案2】:

    改变这个:

    ages[i] = rand() % 65 + 10;
    

    到这里:

    ages[i] = rand() % 56;
    ages[i] += 10;
    

    【讨论】:

    • 谢谢!有用!但应该是ages[i] = rand() % 56;
    • 你能更详细地解释这个答案吗?尤其是为什么你把它分成两行。
    • @GlennTeitelbaum 当他执行 rand() % 65+10 时,就像他正在执行 rand()%75 一样返回 [0,74]。但是当更改为 rand()%56 时,它会返回 [0,55],然后将 10 添加到它变成 [10,65]。
    • 余数运算符的优先级高于加法。将代码分成两行有何不同?
    • 括号也足够了,并且可能会显示原始问题也更好。
    【解决方案3】:

    生成随机数后,假设在 0 到 74 的范围内,但您需要它们在 10 到 65 的范围内,您只需将它们转换为

    x = y * (55.0/74.0) + 10;
    

    或更笼统地说,如果 y 在 [ymin,ymax) 中并且您需要 x 在 [xmin,xmax) 中,则可以通过

    x = (y-ymin) * ( (xmax-xmin)/(ymax-ymin) ) + xmin;
    

    已经有一个(更好的)答案,只是想提一下。

    【讨论】:

    • 这适用于更改浮点数的范围,但对于整数,由于四舍五入,它可以彻底改变随机数的分布。例如,如果您将范围从 0-20 更改为 0-16,则 0、3、6、9 和 12 的数量将是该范围内其他数字的两倍。
    • @JordanMelo 好点。我完全没有想到这一点。所以实际上值得发布答案;)
    【解决方案4】:

    问题不在于 rand() % x + y
    正如Jordan Melo 所指出的,余数 (%) 的优先级高于加法 (+)。分割线对计算没有影响。

    问题是您的lowestValue=0,这是不正确的。 rand() 表达式生成的任何值都不能小于 0。

    这有助于注意您的输出。请注意,没有一个输出值小于 10。这表明您的 rand() 表达式工作正常。

    您修改的代码也不正确
    在您修改的代码中,您已将lowestValuehighestValue 更改为未初始化的值。这意味着您的代码可能有效,也可能无效。

    为了找到最大的,初始最大的必须是最小的可能值。
    为了找到最小值,最初的最小值必须是可能的最大值。

    int lowestValue = 74;
    int largestValue = 10;
    

    希望这会有所帮助。

    【讨论】:

    • 未初始化的变量不是问题,因为在修改后的代码中,Mariel 使用max_elementmin_element 来计算范围。 highestValuelowestValue 在被读取之前确实被初始化(使用这两个函数的结果)。
    猜你喜欢
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 2020-06-11
    • 2017-03-12
    • 2013-07-24
    • 1970-01-01
    相关资源
    最近更新 更多