【发布时间】:2014-08-29 02:00:32
【问题描述】:
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
void randnum()
{
int random;
srand((unsigned int)time(0));
for(int i=1;i<=5;i++)
{
random=(rand()%39)+1;
cout<<random<<endl;
}
}
int main()
{
cout<<"Five random number is here"<<endl;
randnum();
system ("PAUSE");
return 0;
}
我随机这样做是为了练习 C++。我总是在设置随机发生器的范围时感到困惑(我的方法正确吗?从 1 到 39)。另外,如何防止数字相互重叠?也就是说,如果我从 1-39 输出 5 个不同的数字,它总是可以 5 个不同的数字,例如 4,5,2,7,12 而不是 4,5,2,4,12(4 在这里使用了两次)
【问题讨论】:
-
如果您使用的是
C++,请使用标准库。见en.cppreference.com/w/cpp/numeric/random/… -
如果您想从 1 到 39 中选择 5 个数字,最好将所有这些数字添加到一个向量中,将其打乱,然后取前 5 个。
-
当你这样做时,请记住
std::iota和std::shuffle。 -
@Ninja - 我认为这是一个与计算
[a,b]范围内的元素及其排列有关的初学者 C/C++ 问题。我不认为在这种情况下引用的 dup 是等效的,因为它谈论的是渐近分析和执行相同操作的算法的运行时间之类的事情。 (如果海报更高级,那就另当别论了)。我投票决定让他保持开放,这样他就可以得到一些关于在[a,b]范围内计数、排列和没有重复的简单答案。 (并且在某个地方可能有更合适的副本)。 -
This answer 展示了如何对一组数字进行洗牌 - 然后你可以取前 5 个或其他数字。或者,如果您选择一小部分潜在值,则将每个选择与已选择的值进行比较会更快。
标签: c++ shuffle visual-c++-2010