gpt4 book ai didi

c++ - 给定范围内的随机数生成器

转载 作者:搜寻专家 更新时间:2023-10-31 01:06:05 24 4
gpt4 key购买 nike

我正在尝试编写一个程序,该程序使用一个函数在用户提供的范围内生成 10 个随机数。它似乎工作正常,除了返回的数字都是 1 的事实:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int rand_int(int min, int max);

int main()
{
int min, max;

cout << "Hello user.\n\n"
<< "This program will generate a list of 10 random numbers within a
given range.\n"
<< "Please enter a number for the low end of the range: ";
cin >> min;
cout << "You entered " << min << ". \n"
<< "Now please enter a number for the high end of the range: ";
cin >> max;

while(min > max){
cout << "Error: Your low number is higher than your high number.\n"
<< "Please reenter your high number, or press ctrl + c
to end program.\n";
cin >> max;
cout << endl;
}

for(int i = 0; i < 10; i++){
int rand_int(int min, int max);
cout << rand_int << endl;
}

return 0;
}


int rand_int(int min, int max)
{
srand(time(0)); // Ensures rand will generate different numbers at different times

int range = max - min;

int num = rand() % (range + min);

return num;
}

最佳答案

打开警告可能对这里有所帮助,-Wall 标志 gcc 告诉我们:

warning: the address of 'int rand_int(int, int)' will always evaluate as 'true' [-Waddress]
cout << rand_int << endl;
^

尽管 clang 给出了警告,但不需要添加标志。您在这里使用函数指针,因为 std::cout没有 overload对于函数指针,它正在选择 bool 重载并将函数指针转换为 true。调用应该是这样的:

std::cout << rand_int(min, max)  <<std::endl;

虽然这不能完全解决您的问题,但您还需要移动:

srand(time(0));

在你的函数之外,最好是在你程序的开始。由于您很快调用了 rand_int 十次,因此 time(0) 的结果可能是相同的,因此您将返回相同的 10数。

这一行:

int rand_int(int min, int max);

在for循环中只是函数的重新声明,不需要。

不过,如果 C++11 是一个使用 random header 的选项更有意义,也更简单:

#include <iostream>
#include <random>

int main()
{
std::random_device rd;

std::mt19937 e2(rd());

std::uniform_int_distribution<int> dist(1,10);

for (int n = 0; n < 10; ++n) {
std::cout << dist(e2) << ", " ;
}
std::cout << std::endl ;
}

如果 C++11 不是一个选项,那么您至少应该查看 How can I get random integers in a certain range? C FAQ 条目给出了以下用于生成 [M, N] 范围内数字的公式:

M + rand() / (RAND_MAX / (N - M + 1) + 1)

当然还有提升:

#include <iostream>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int_distribution.hpp>

int main()
{
boost::random::mt19937 gen;
boost::random::uniform_int_distribution<> dist(1, 10);

for (int n = 0; n < 10; ++n) {
std::cout << dist(gen) << ", ";
}
std::cout << std::endl ;
}

关于c++ - 给定范围内的随机数生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21506523/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com