生成不同的随机数

时间:2016-04-28 18:08:40

标签: c++ random

我想生成不同的随机数。我使用了srand和rand,但在我的输出中,一些数字是相同的。

这是我的输出: enter image description here

如何处理srand以生成不同的数字?

#include<iostream>
#include<time.h>
#include <windows.h>

int main(){
    time_t t;
std::vector<int> myVector;
srand((unsigned)time(NULL));

for (int i = 0; i < 40; i++){

    int b = rand() % 100;
    myVector.push_back(b);
    std::cout << myVector[i] << std::endl;
}
Sleep(50000);

}

6 个答案:

答案 0 :(得分:2)

一种简单的方法是将0-99中的所有数字添加到矢量并随机播放,然后您可以根据需要获得尽可能多的(最多100个)非重复随机数。

#include <algorithm>
#include <chrono>
#include <iostream>
#include <random>
#include <vector>

int main(void) {

    std::vector<int> numbers;

    for(int i=0; i<100; i++)       // add 0-99 to the vector
        numbers.push_back(i);

    unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
    std::shuffle(numbers.begin(), numbers.end(), std::default_random_engine(seed));

    for(int i=0; i<40; i++)        // print the first 40 randomly sorted numbers
        std::cout << numbers[i] << std::endl;

}

答案 1 :(得分:1)

你可以使用一套:

std::set<int> numbers;
while (numbers.size() < 40)
{
    numbers.add(rand() % 100);
}

然后根据需要将其复制到vector

答案 2 :(得分:0)

您可以轻松地创建一组独特的随机数:

#include<iostream>
#include<vector>

int main(){
    std::vector<int> myVector;
    srand((unsigned)time(NULL));

    for (int i = 0; i < 40; i++) {
        int b = rand() % 100;
        if(!std::find(std::begin(myvector),std::end(myvector),b)) {
            myVector.push_back(b);
            std::cout << myVector[i] << std::endl;
        }
    }
}

答案 3 :(得分:0)

这是一个统计(数学)问题。随机数可以彼此相同。如果您需要唯一的号码,您必须检查它们之前是否使用过。例如:

for (int i = 0; i < 40; i++){

    int b = rand() % 100;
    for (int j = 0; j < i; j++){
        if(myVector[j]==b)i--;
        else{
            myVector.push_back(b);
            std::cout << myVector[i] << std::endl;
        }
    }
}

答案 4 :(得分:0)

srand数字生成器可以给出相同的数字。

您可以实施一个解决方案,删除重复项而不将它们添加到矢量中。例如:

#include <iostream>
#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> myVector;
    srand((unsigned)time(NULL));

    while(myVector.size() < 40)
    {
        int b = rand() % 100;
        if ( !(std::find(myVector.begin(), myVector.end(), b) != myVector.end()))
        {
           myVector.push_back(b);
           std::cout << myVector.at(myVector.size()-1) << std::endl;
        }

    }
    Sleep(50000);

    return 0;
}

答案 5 :(得分:0)

摆脱重复的简单方法是在std::unique中使用<algorithm>

以下是使用中的示例:

#include <vector>
#include <iostream>
#include <algorithm>
#include <random>

int ran(int min, int max)
{
    std::random_device r;
    std::mt19937 gen(r());
    std::uniform_int_distribution<> dis(min, max);
    return dis(gen);
}

int main()
{
    const int fill_size = 10; 
    const int min = 1;        // min random number
    const int max = 100;      // max random number

    std::vector<int> vec;
    while (vec.size() != fill_size) {
        vec.emplace_back(ran(min, max)); // create new random number
        std::sort(begin(vec), end(vec)); // sort before call to unique
        auto last = std::unique(begin(vec), end(vec));
        vec.erase(last, end(vec));       // erase duplicates
    }

    std::random_shuffle(begin(vec), end(vec)); // mix up the sequence
    for (const auto& i : vec)                  // and display elements
        std::cout << i << " ";
}