使用数组从1到100生成10个随机数

时间:2014-12-01 02:58:03

标签: c++ arrays

这是我到目前为止所得到的:

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;
}

然而,我对数组非常困惑,我不明白如何生成随机数而不与数组重复。

4 个答案:

答案 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了解一种方法。