Generate different random numbers

吃可爱长大的小学妹 提交于 2020-01-14 03:16:09

问题


I want to generate different random numbers . I used srand and rand , but in my output some numbers are identical .

This is my output :

How to do with srand to generate different numbers ?

#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);

}

回答1:


One easy way is to add all numbers from 0-99 to a vector and shuffle it, then you can get as many (up to 100) non repeating random numbers as you require.

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

}



回答2:


You could use a set:

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

and then copy it into a vector if necessary.




回答3:


srand number generator can give identical numbers.

You could implement a solution which deletes duplicates not adding them to the vector. For example:

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



回答4:


An easy way of getting rid of duplicates is using std::unique in <algorithm>.

Here is an example of that in use:

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



回答5:


You can easily achieve a unique set of random numbers writing:

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



回答6:


This is a statistical (mathematical) issue. Random numbers may be identical to eachother. If you need unique numbers, you must check to see if they are used before. For example like this:

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


来源:https://stackoverflow.com/questions/36922371/generate-different-random-numbers

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!