Générer N nombres aléatoires et uniques dans une plage
Ce qui est un moyen efficace de générer des N nombres uniques à l'intérieur d'une plage à l'aide de C#? Par exemple, de générer des 6 numéros uniques entre 1 et 50. D'une manière paresseuse serait de tout simplement utiliser Random.Next()
dans une boucle et de stocker ce nombre dans un tableau/liste, puis de les répéter et de vérifier s'il existe déjà ou pas etc.. Est-il une meilleure façon de générer un groupe de hasard, mais unique, de chiffres?
Pour ajouter plus de contexte, je voudrais sélectionner N aléatoire des éléments d'une collection, à l'aide de leur index.
grâce
source d'informationauteur Skoder
Vous devez vous connecter pour publier un commentaire.
Prendre un tableau de 50 éléments:
{1, 2, 3, .... 50}
Mélanger le tableau à l'aide de l'une des algorithmes de façon aléatoire brassage des tableaux. Les six premiers éléments du tableau modifié est ce que vous cherchez. HTH
Pour les 6-à partir de-50, je ne suis pas trop sûr que je serais s'inquiéter de l'efficacité puisque la probabilité d'un duplicata est relativement faible (30% sur l'ensemble de mon dos-de-la-enveloppe de calculs). Vous pourriez très facilement se rappeler les précédents numéros, vous auriez générés et de les jeter, quelque chose comme (pseudo-code):
Toutefois, cela ne se décomposent comme vous vous déplacez à partir de 6-de-50-48-de-50, ou de 6 de 6, depuis les doublons commencer à obtenir loin plus probable. C'est parce que le pool de numéros disponibles est plus petit et vous vous retrouvez jeter de plus en plus.
Pour une solution efficace qui vous donne un sous-ensemble de vos valeurs avec zéro possibilité de doublons (et pas inutile, avant de tri), Fisher-Yates est le chemin à parcourir.
Il suffit de sélectionner un nombre aléatoire à partir de la piscine, pour le remplacer par le nombre supérieur de la piscine, puis la réduction de la taille de la piscine, vous obtenez un shuffle sans avoir à se soucier d'un grand nombre de swaps de front.
C'est important si le nombre est élevé en qui il n'a pas d'introduire une inutiles au démarrage de retard.
Par exemple, examiner les éléments suivants banc de vérifier, en choisissant 10-à partir de-10:
Vous pouvez voir la piscine réduire comme vous allez, et, parce que vous êtes toujours en remplacement de l'utilisé avec un inutilisés, vous n'aurez jamais de le répéter.
En utilisant les résultats obtenus à partir de ce que les index dans votre collection de garantir qu'aucun des articles en double seront sélectionnés.
Pour les grands ensembles de numéros uniques, les mettre dans une Liste..
Puis générer aléatoirement un nombre de 1 à myInts.Le comte. Stocker les
myInt
de la valeur et de l'enlever de la Liste. Pas besoin de mélanger la liste, ni de regarder pour voir si la valeur existe déjà.Ce tableau contient les 5 nombres aléatoires de 0 à 4.
ou
Ce tableau contient les 5 nombres aléatoires entre 0 à 10.
au lieu d'utiliser
List
utilisationDictionary
!!Dans le cas où il aide à quelqu'un d'autre, je préfère allouer le nombre minimum d'éléments nécessaires. Ci-dessous, j'utilise un HashSet, ce qui garantit que les nouveaux objets sont uniques. Cela devrait fonctionner avec de très grandes collections ainsi, jusqu'à la limite de ce HashSet joue de nice avec de.
générer de l'aléatoire unique de la nsa, de 1 à 40 :
de sortie confirmée :
exemple de sortie :
7
38
14
18
13
29
28
26
22
8
24
19
35
39
33
32
20
2
15
37