生成10到65之间的随机数

时间:2015-11-27 14:58:51

标签: c++ random

我希望我的程序生成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;
}

4 个答案:

答案 0 :(得分:2)

改变这个:

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

对此:

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

答案 1 :(得分:2)

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

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<int>::max()而不是int lowestValue = 0开始并包含#include <limits>,则应获得预期结果。

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

答案 2 :(得分:1)

生成随机数后,假设在0到74的范围内,但是你需要它们在10到65的范围内,你只需要通过

进行转换。
x = y * (55.0/74.0) + 10;

或更一般,如果y位于[ymin,ymax)且您需要[xmin,xmax)中的x,则可以通过

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

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

答案 3 :(得分:1)

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

问题在于您的lowestValue=0,这是不正确的。 rand()表达式生成的值不能低于0.

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

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

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

int lowestValue = 74;
int largestValue = 10;

希望这有帮助。