3 votes

Occurrences aléatoires

Je ne suis pas tout à fait sûr de comment faire cela.

J'ai besoin de générer 14 296 nombres aléatoires avec différents niveaux de probabilité.

donc par exemple j'ai besoin d'un tableau contenant les nombres 18, 1 et 17. Chaque nombre a une probabilité d'occurrence différente. Donc :

55% = 18
(7 862.8 fois)

30% = 1
(4 288.8 fois)

15% = 17
(2 144.4 fois)

le résultat ressemblerait à quelque chose comme new Array() { 18, 18, 1, 17, 1, 18...}

4voto

Jon Skeet Points 692016

Si vous avez toujours des valeurs en pourcentage entier, je remplirais un tableau de 100 éléments avec des valeurs en fonction de la probabilité, donc dans ce cas votre tableau aura 55 occurrences de 18, 30 occurrences de 1 et 15 occurrences de 17. Ensuite, il vous suffit de choisir 14 296 valeurs aléatoires de ce tableau. (c'est-à-dire choisir un entier dans la plage [0, 100) et prendre cet élément.)

Pour différentes façons d'exprimer les probabilités, il existe bien sûr différentes approches. Mais si vous avez des pourcentages en entiers, c'est une option facile à comprendre. (Une autre façon est d'ajuster toutes les probabilités par le total, c'est-à-dire dans une plage de [0, 1), puis de choisir un double aléatoire dans cette plage.)

2voto

vines Points 3649

Divisez la plage du générateur aléatoire en segments proportionnels, et, en jugeant dans quel segment le prochain nombre aléatoire est tombé, sélectionnez le nombre correspondant dans votre ensemble.

Quelque chose comme (simplifié) :

const int numbers[3] = { 1, 17, 18 };
const int borders[2] = { 0.30*MAX_RANDOM, (0.30 + 0.15) *  MAX_RANDOM };

int i = random.next(), num;

if      (i < borders[0]) num = number[0];
else if (i < borders[0]) num = number[1];
else num = number[2];

Bien sûr, s'il y a plus de trois nombres, il est préférable d'utiliser une boucle.

Note : contrairement à la solution de Jon Skeet, celle-ci peut fournir n'importe quelle granularité souhaitée jusqu'à 1/(MAX_RANDOM+1) (qui est souvent jusqu'à 2^32 sur les machines 32 bits), plutôt que strictement 1%.

1voto

Albin Sunnanbo Points 30722
Random r = new Random();

// pour chaque nombre à générer
int nextNumber;
double probabilite = r.NextDouble();
if (probabilite < 55.0 / 100.0)
    nextNumber = 18;
else if (probabilite < (55.0 + 30.0) / 100.0)
    nextNumber = 1;
else
    nextNumber = 17;

1voto

Mario Points 16720

Que diriez-vous de quelque chose comme ceci (non testé) :

struct np
{
    int n;
    int p;
}

Créez une List et remplissez-la avec des paires de valeurs/ pourcentages (par exemple, n = 18, p = 55).

Ensuite, il suffit de faire ce qui suit pour choisir un nombre :

List npl = new List();
// (remplir la liste ici)

int r = rnd.next(total_of_all_p_values); // obtenir un nombre aléatoire
int res = 0; // résultat
for(int i = 0; i < npl.Length(); r -= npl[i++].n)
{
    if(r < npl[i].p) // la valeur restante est plus petite que le pourcentage actuel
    {
        res = npl[i].n;
        break;
    }
}

0voto

devdigital Points 22495

Vous pourriez peupler une List avec le nombre approprié de chacun des 3 chiffres, puis mélangez la liste.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X