在 C++ 中以较小的间隔生成随机数

generate random numbers in c ++ for small intervals

本文关键字:随机数 C++      更新时间:2023-10-16

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

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

您可能希望保留一个随机数池,该池在开始时或每个时间段填充一次。它应该足够大,所以每次你从中获得新的随机值时,它都是一个新的。在这种情况下,您可以按照 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;
};