我希望我的程序生成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;
}
答案 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_element
和max_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()表达式正常工作。
您的修改后的代码也不正确
在修改过的代码中,您已将lowestValue
和highestValue
更改为未初始化的值。这意味着您的代码可能有效,也可能无效。
为了找到最大,初始最大值必须是可能的最小值。
为了找到最小,初始最小值必须是最大可能值。
int lowestValue = 74;
int largestValue = 10;
希望这有帮助。