c ++随机数生成器,允许用户选择范围
c++ random number generator that allows user to choose range
我必须想出一个随机数生成器,它将生成 5 个随机数,这些随机数在用户输入的两个数字的范围内。示例:用户先输入 1,然后输入 10。生成的随机数可能是 2、3、4、5、8。我可以让它给我 1 个随机数 5 次,而不是 5 个不同的随机数。请看下面。任何帮助表示赞赏。谢谢!
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main ()
{
int num1, num2, randNum, seed;
cout << "enter number 1.\n";
cin >> num1;
cout << "enter number 2.\n";
cin >> num2;
seed = num1 - num2;
randNum = rand() % seed + 1;
cout << randNum << "\n";
cout << randNum << "\n";
cout << randNum << "\n";
cout << randNum << "\n";
cout << randNum << "\n";
return 0;
}
randNum
不会在您每次调用 cout
时修改,因此它始终显示相同的值。如果你想让它工作,你需要使用这样的循环
for(int i=0;i<5;i++){
randNum = rand() % seed + num2;
cout << randNum << "\n";
}
第二个错误是使用 +1
而不是 +num2
,因此假设 num2
小于 num1
,这将生成您期望范围内的数字。
您还应该考虑的另一件事是变量的名称 seed
。种子是您用来初始化随机数生成器的东西。这里你的变量只是在这里表示一个范围。要在每次 运行 程序时获得不同的结果,您需要用一些东西初始化 rand,例如:srand(time(0));
您正在生成一个随机数,然后将其打印五次。代码 rand() % seed + 1
是生成值的代码。您将那个值保存在 randNum
中并打印五次。您可以多次 运行 代码 rand() % seed + 1
以获得多个值。
您在此上下文中没有正确使用 'seed' 一词。在伪随机数生成器的上下文中,种子是生成器的初始状态。 rand()
使用的 pRNG 的播种是通过将种子值传递给 srand()
来完成的('s' 代表种子)。
无论如何,你不应该使用 rand()
。而是使用 C++ <random>
库。使用此库,您可以非常轻松地在用户定义的范围内创建值。
使用 <random>
生成随机值的基本方法使用两个组件:'randomness' 的来源、pRNG,我将其称为引擎,以及从引擎并使用它在特定范围内随机生成值。
#include <iostream>
#include <random>
int main() {
int min, max;
std::cout << "enter number 1.\n";
std::cin >> min;
std::cout << "enter number 2 (greater than number 1).\n";
std::cin >> max;
std::uniform_int_distribution<> make_number_in_range(min, max);
std::mt19937 engine;
std::cout << make_number_in_range(engine) << ' ';
std::cout << make_number_in_range(engine) << ' ';
std::cout << make_number_in_range(engine) << ' ';
std::cout << make_number_in_range(engine) << ' ';
std::cout << make_number_in_range(engine) << ' ';
}
enter number 1. 1
enter number 2 (greater than number 1). 6
5 2 5 6 2
在此代码中,值由代码 make_number_in_range(engine)
生成。请注意,此代码 运行 多次以产生多个值。
另请注意,不必使用一些算术运算来操纵 rand()
的结果,您只需告诉 make_number_in_range
您想要的范围即可。您的原始代码执行了错误的算术运算,但此代码不必担心。
您的原始程序和我上面显示的程序每次使用特定输入 运行 时都不会产生不同的输出。这是因为随机数生成器始终以相同的初始状态开始。 (但是,不同的实现会显示不同的结果,因此当您尝试我使用的范围时,您可能不会看到与我上面显示的相同的数字。)
为了每次程序 运行 都得到不同的结果,您需要每次都以不同的方式播种 pRNG。为此,您可以像这样更新程序:
#include <iostream>
#include <random>
int main() {
int min, max;
std::cout << "enter number 1.\n";
std::cin >> min;
std::cout << "enter number 2 (greater than number 1).\n";
std::cin >> max;
std::uniform_int_distribution<> make_number_in_range(min, max);
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937 engine(seed);
std::cout << make_number_in_range(engine) << ' ';
std::cout << make_number_in_range(engine) << ' ';
std::cout << make_number_in_range(engine) << ' ';
std::cout << make_number_in_range(engine) << ' ';
std::cout << make_number_in_range(engine) << ' ';
}
我必须想出一个随机数生成器,它将生成 5 个随机数,这些随机数在用户输入的两个数字的范围内。示例:用户先输入 1,然后输入 10。生成的随机数可能是 2、3、4、5、8。我可以让它给我 1 个随机数 5 次,而不是 5 个不同的随机数。请看下面。任何帮助表示赞赏。谢谢!
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main ()
{
int num1, num2, randNum, seed;
cout << "enter number 1.\n";
cin >> num1;
cout << "enter number 2.\n";
cin >> num2;
seed = num1 - num2;
randNum = rand() % seed + 1;
cout << randNum << "\n";
cout << randNum << "\n";
cout << randNum << "\n";
cout << randNum << "\n";
cout << randNum << "\n";
return 0;
}
randNum
不会在您每次调用 cout
时修改,因此它始终显示相同的值。如果你想让它工作,你需要使用这样的循环
for(int i=0;i<5;i++){
randNum = rand() % seed + num2;
cout << randNum << "\n";
}
第二个错误是使用 +1
而不是 +num2
,因此假设 num2
小于 num1
,这将生成您期望范围内的数字。
您还应该考虑的另一件事是变量的名称 seed
。种子是您用来初始化随机数生成器的东西。这里你的变量只是在这里表示一个范围。要在每次 运行 程序时获得不同的结果,您需要用一些东西初始化 rand,例如:srand(time(0));
您正在生成一个随机数,然后将其打印五次。代码 rand() % seed + 1
是生成值的代码。您将那个值保存在 randNum
中并打印五次。您可以多次 运行 代码 rand() % seed + 1
以获得多个值。
您在此上下文中没有正确使用 'seed' 一词。在伪随机数生成器的上下文中,种子是生成器的初始状态。 rand()
使用的 pRNG 的播种是通过将种子值传递给 srand()
来完成的('s' 代表种子)。
无论如何,你不应该使用 rand()
。而是使用 C++ <random>
库。使用此库,您可以非常轻松地在用户定义的范围内创建值。
使用 <random>
生成随机值的基本方法使用两个组件:'randomness' 的来源、pRNG,我将其称为引擎,以及从引擎并使用它在特定范围内随机生成值。
#include <iostream>
#include <random>
int main() {
int min, max;
std::cout << "enter number 1.\n";
std::cin >> min;
std::cout << "enter number 2 (greater than number 1).\n";
std::cin >> max;
std::uniform_int_distribution<> make_number_in_range(min, max);
std::mt19937 engine;
std::cout << make_number_in_range(engine) << ' ';
std::cout << make_number_in_range(engine) << ' ';
std::cout << make_number_in_range(engine) << ' ';
std::cout << make_number_in_range(engine) << ' ';
std::cout << make_number_in_range(engine) << ' ';
}
enter number 1.
1
enter number 2 (greater than number 1).6
5 2 5 6 2
在此代码中,值由代码 make_number_in_range(engine)
生成。请注意,此代码 运行 多次以产生多个值。
另请注意,不必使用一些算术运算来操纵 rand()
的结果,您只需告诉 make_number_in_range
您想要的范围即可。您的原始代码执行了错误的算术运算,但此代码不必担心。
您的原始程序和我上面显示的程序每次使用特定输入 运行 时都不会产生不同的输出。这是因为随机数生成器始终以相同的初始状态开始。 (但是,不同的实现会显示不同的结果,因此当您尝试我使用的范围时,您可能不会看到与我上面显示的相同的数字。)
为了每次程序 运行 都得到不同的结果,您需要每次都以不同的方式播种 pRNG。为此,您可以像这样更新程序:
#include <iostream>
#include <random>
int main() {
int min, max;
std::cout << "enter number 1.\n";
std::cin >> min;
std::cout << "enter number 2 (greater than number 1).\n";
std::cin >> max;
std::uniform_int_distribution<> make_number_in_range(min, max);
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937 engine(seed);
std::cout << make_number_in_range(engine) << ' ';
std::cout << make_number_in_range(engine) << ' ';
std::cout << make_number_in_range(engine) << ' ';
std::cout << make_number_in_range(engine) << ' ';
std::cout << make_number_in_range(engine) << ' ';
}