这是我到目前为止所得到的:
using namespace std;
int main() {
int i = 0;
srand(time(0));
int array[10], i;
for(int i=0; i<100; i++) :
[i] = rand()%100+1;
}
return 0;
}
然而,我对数组非常困惑,我不明白如何生成随机数而不与数组重复。
答案 0 :(得分:2)
任何时候你想要一组没有重复的N个随机数,考虑改组该组,然后选择前N个元素。然后,您不必跟踪已经看过的项目。
答案 1 :(得分:2)
有&#34;发烧友&#34;如何做到这一点,但保持尽可能简单:
int main()
{
srand(time(0));
int array[10];
bool used[101] = {false};
for (int i = 0; i < 10; ++i)
{
do
{
array[i] = rand() % 100 + 1;
} while (used[array[i]);
used[array[i]] = true;
}
}
请注意,您的for
循环测试是i<100
,该测试不在10个元素数组的末尾!
答案 2 :(得分:0)
首先,你不应该在两个地方宣布我。这会产生可能的错误来源。
其次,你应该在for循环之后用“{”替换“:”。那将是第二个可能的错误来源。
第三,“[i] = rand()%100 + 1;”有问题。我建议你自己解决这个问题。
另外,请在下次输出您的整个代码,因为像我这样的编码员必须看到整个代码,以便调试更容易。 (我知道代码可能不完整,因为“未使用int array [10]。
答案 3 :(得分:0)
如果你必须从一系列数字中生成随机数而没有任何重复数据,那么你实际上有一个非常类似的情况来改组一副牌并将其处理掉。这是因为您有一组有限的值可以生成,一旦您使用了一个值,您就无法再次使用它。解决这个问题的一种方法是将所有可能的值放入一个数组中,然后对数组进行洗牌,你可以&#34; pop&#34;通过更改您访问的索引来关闭数组中的元素(就像&#34;弹出&#34;卡片中的卡片),生成的值将以随机顺序出现而不会发生任何重复。如果改组阵列的额外开销很好,那么这种方法是概念上最简单的方法之一。 (如果你只需要非常少量的元素并且你有一个非常大的数组,那么在整个数组上执行随机shuffle相对于其他选项来说通常会很昂贵)
至于在现代c ++中这样做,有一堆非常好的库函数(在统计上优于rand()
)为你做这件事而不必处理通常的所有讨厌的东西参与随机数生成。
#include <random>
#include <algorithm>
#include <iterator>
#include <iostream>
int main()
{
std::vector<int> v;
for(int i=0; i<100; i++){
v.push_back(i);
}
std::random_device rd;
std::mt19937 generator(rd());
std::shuffle(v.begin(), v.end(), generator);
std::copy(v.begin(), v.begin()+10, std::ostream_iterator<int>(std::cout, " "));
std::cout << "\n";
}
在此处查看此操作:http://ideone.com/UerZQn
如果您需要在不修改数组的情况下生成值,请参阅TonyD's answer了解一种方法。