在c ++中生成小间隔的随机数

时间:2018-03-19 17:32:38

标签: c++

我正在开发一个程序来计算扑克游戏的几率,它正在进行中。我发现了如何生成随机数,但这些随机数取决于时间,不适合在小间隔内生成随机数。我想知道如何生成随机数而不必依赖计算机时间。

#include <cstdlib>
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>  

using namespace std;

int main() {
    srand(time(NULL));
    int N = 1000, T=100;
    int j;
    float tcouple = 0, ttrio = 0, tfull = 0, tpoker = 0, trien = 0;
    struct Lettre{ int numero; char baton;};
    Lettre lettre[5];
    for(int a = 0; a < T; a++)
    {
        int couple = 0, trio = 0, full = 0, poker = 0;
        for(int i = 0; i< N; i++){
            int d = 0 ;
            for(j = 0; j < 5; j++)
            {
                int r = 0;
                lettre[j].numero = (1 + rand() % 13);
                r = (1 + rand() % 4);
                switch(r)
                {
                    case 1:
                        lettre[j].baton = 'T';
                        break;
                    case 2:
                        lettre[j].baton = 'P';
                        break;
                    case 3:
                        lettre[j].baton = 'C';
                        break;
                    case 4:
                        lettre[j].baton = 'D';
                        break;
                }
            }
            for(int l = 0; l < 4; l++)
            {
                for(int k = l + 1; k<5; k++)
                {
                    if(lettre[l].numero == lettre[k].numero)
                        d = d + 1;
                }
            }
            if (d == 1)
                couple = couple + 1;
            if (d == 3)
                trio = trio + 1;
            if(d == 4)
                full = full + 1;
            if(d==6)
                poker = poker + 1;
        }
        tcouple = tcouple + couple;
        ttrio = ttrio + trio;
        tfull = tfull + full;
        tpoker = tpoker + poker;
    }
    trien=(T*N)-(tcouple+ttrio+tfull+tpoker);
    cout << "probabilite couple: " << tcouple/(T*N) <<endl;
    cout << "probabilite trio: " << ttrio/(T*N) <<endl;
    cout << "probabilite full: " << tfull/(T*N) <<endl;
    cout << "probabilite poker: " << tpoker/(T*N) <<endl;
    cout << "probabilite rien: " << trien/(T*N) << endl;
    return 0;
}

1 个答案:

答案 0 :(得分:0)

您可能希望保留一个随机数字池,该数据池在开始时或一段时间内填充。它应该足够大,所以每当你从它获得新的随机值时它就是一个新的。在这种情况下,您可以使用Timo建议的uniform_int_distribution,甚至rand

struct RandPool
{
    void Generate()
    {
        srand(time(nullptr));
        for (int i = 0; i < 1000'000; ++i)
            mNumbers.push_back(rand());
        mIndex = 0;
    }

    int Next() 
    {
        return mNumbers[mIndex++];
    }

private:

    int mIndex = 0;
    std::vector<int> mNumbers;
};