Générer un nombre aléatoire entre deux nombres avec un nombre rare

Je peux générer un nombre aléatoire entre deux nombres en c en utilisant ceci ..

arc4random()%(high-low+1)+low; 

alors maintenant, mon exigence est … je veux faire un nombre rare …. thats dire si

haut = 5, bas = 1 et rare = 3,

que 3 sera apparu beaucoup plus rarement que 1,2,4 et 5 …

Merci

Vous pouvez utiliser des tableaux pour calculer votre dernier rouleau, de la même manière que les RPG papier et stylo effectuent ce même type de calcul:

Rouler 1 D 21 (facilement éventuellement avec code).

  • Si vous obtenez 1-5, cela compte comme 1
  • Si vous obtenez 6-10, cela compte pour 2
  • Si vous obtenez 11-15, cela compte comme un 4
  • Si vous obtenez 16-20, cela compte pour un 5
  • Si vous obtenez un 21, cela compte comme un 3

L’avantage de cette option est que vous avez une idée précise des probabilités exactes auxquelles vous avez affaire. Vous pouvez avoir une idée précise de la rareté ou de la communeité de chaque numéro et obtenir un contrôle précis de la fréquence de chaque numéro par rapport aux autres.

Vous pouvez également utiliser des fractions pour générer la table. Utilisez le plus petit multiple commun pour déterminer une base commune. Cette base est la taille maximum de nombres aléatoires dont vous aurez besoin. Ensuite, mettez toutes les fractions dans les mêmes termes. Utilisez les numérateurs résultants pour déterminer la taille de la plage pour chaque nombre figurant dans le tableau.

Avec cette solution automatisée, les chiffres saisis sont très faciles à comprendre les uns par rapport aux autres. Par exemple:

  • 1/4 pour 1
  • 1/4 pour 2
  • 1/4 pour 4
  • 1/5 pour 5
  • 1/20 pour 3

Cela générerait une table comme celle-ci:

LCM = 20

  • 1-5 = 1 (termes identiques – 5/20)
  • 6-10 = 2 (5/20)
  • 11-15 = 4 (5/20)
  • 16-19 = 5 (4/20)
  • 20 = (1/20)

Un peu plus sur LCM: http://en.wikipedia.org/wiki/Least_common_multiple

Une option simple à comprendre:

  • Générez un nombre pour déterminer si vous allez retourner le nombre rare (par exemple, générer un nombre compris dans l’intervalle [0-99], et s’il vaut 0, renvoyer le nombre rare
  • Si vous arrivez à cette étape, vous renvoyez un nombre non-rare: continuez à générer des nombres dans la plage normale jusqu’à ce que vous obteniez un nombre non-rare, et renvoyez-le.

Il existe d’autres approches alternatives qui ne nécessitent que la génération d’un nombre unique, mais ce qui précède donne l’impression que ce serait la plus simple à écrire et à comprendre.

Vous pouvez créer un tableau contenant les nombres en fonction de leur probabilité:

 list = (1, 1, 2, 2, 3, 4, 4, 5, 5); return list.itemAtIndex(random() % list.count()); 

Ce n’est pas très élégant, mais cela fonctionne et s’adapte facilement si les probabilités deviennent plus complexes.

La sum de toutes les probabilités doit être 1. Maintenant, nous travaillons ici avec des probabilités discrètes sur une plage finie. Nous examinons donc (ici) 5 possibilités avec une dissortingbution que vous avez, appelez-les p1, p2, p4, p4 et p5. dont 1

f0 = 0 f1 = p1 f2 = f1 + p2 f3 = f2 + p3 f4 = f3 + p4 f5 = f4 + p5 et doit être égal à 1

Générez un nombre aléatoire de 0 à 1 et nous supposerons qu’il ne peut pas être exactement 1. Regardez la valeur f qui correspond à son plafond et qui correspond à la valeur de votre événement aléatoire. Alors peut être

f1 = 0,222 f2 = 0,444 f3 = 0,555 f4 = 0,777 f5 = 1

Si votre nombre aléatoire est 0,645, vous avez généré un événement 4. Avec ce qui précède, vous avez deux fois moins de chances de générer un 3 que les autres. Nous pouvons le rendre moins probable encore, par exemple:

f1 = 0,24 f2 = 0,48 f3 = 0,52 f4 = 0,76 f5 = 1

0,24 probablement des autres et seulement 0,04 d’un 3.

Passons à travers cela. Nous utilisons d’abord la fonction srand () pour initialiser le randomiseur. Fondamentalement, l’ordinateur peut générer des nombres aléatoires en fonction du nombre fourni à srand (). Si vous donniez la même valeur de départ, les mêmes nombres aléatoires seraient générés à chaque fois.

Par conséquent, nous devons associer le randomiseur à une valeur qui change constamment. Nous faisons cela en lui donnant la valeur de l’heure actuelle avec la fonction time ().

Maintenant, lorsque nous appelons rand (), un nouveau nombre aléatoire sera produit à chaque fois.

 #include int random_number(int min_num, int max_num); int main(void) { printf("Min : 1 Max : 30 %d\n",random_number(0,5)); printf("Min : 100 Max : 1000 %d\n",random_number(100,1000)); return 0; } int random_number(int min_num, int max_num) { int result=0,low_num=0,hi_num=0; if(min_num 
 while true generate a random number if it's not the rare number, return it generate a second random number - say from 1 to 100 if that second number's <= the percentage chance of the rare number compared to the others, return the rare number 

Remarque: cette procédure est rapide pour les cas courants ou pour le renvoi du nombre non rare.