remplissage d'un tableau avec le nombre aléatoire
Je suis en train de remplir un tableau de 20 entiers avec des nombres de 1 à 20 dans un ordre aléatoire.
voici mon code:
int lookup[20]={0};
int array[20]={0};
srand(time(NULL));
for(int i=0;i<20;++i){
bool done=false;
while(!done){
int n=rand()%20;
if(lookup[n]==0){
array[i]=n;
lookup[n]=1;
done=true;
}
}
}
J'ai créé une liste de choix de la matrice de vérifier si le nombre aléatoire est pas encore choisi, et de les stocker dans un tableau. Comme vous pouvez le voir, j'ai créé 2 boucles, une pour la traversée tableau et le tout pour choisir le nombre aléatoire. Dans chaque boucle while itération, le nombre peut réapparaître et causant une autre boucle while. Est-il plus rapide façon de le faire?
appliquer de nombres aléatoires-générateur de balise
Voir aussi: stackoverflow.com/questions/1218155/..., stackoverflow.com/questions/1816534/random-playlist-algorithm, stackoverflow.com/questions/417831/..., stackoverflow.com/questions/813935/...
Voir aussi: stackoverflow.com/questions/1218155/..., stackoverflow.com/questions/1816534/random-playlist-algorithm, stackoverflow.com/questions/417831/..., stackoverflow.com/questions/813935/...
OriginalL'auteur James | 2010-03-03
Vous devez vous connecter pour publier un commentaire.
Vous pouvez remplir le tableau dans l'ordre et ensuite mélanger. Qui permettrait d'éviter d'avoir à toujours faire plus que 20 nombre aléatoire générations.
Shuffle de Fisher-Yates: peut se faire en O(n) fois.
De wikipedia:
Si votre utilisation de C++ spécifiquement et non C puis graham.roseaux suggestion d'utiliser std:random_shuffle permettra de vous rendre où vous voulez aller sans risque de faire une erreur de mise en œuvre de l'algorithme de shuffle. Si vous êtes à l'aide de C, alors il existe un code de mise en œuvre sur la page de Wikipédia (et probablement ailleurs sur le web) que vous pouvez copier.
Oui! Je suis à l'aide de C++ pour cela. std::random_shuffle est bon d'y aller, mais je pense que je vais essayer de la mise en œuvre de l'algorithme de shuffle. Merci pour la réponse.
Rappelez-vous juste que de réinventer la roue laisse également place à réinventer une grande variété d'insectes, à la fois évidente et subtile.
OriginalL'auteur sfg
Regarder
std::random_shuffle
etstd::vector
.Je me suis toujours demandé pourquoi il est appelé
random_shuffle
. Genre de implique qu'il existe unnonrandom_shuffle
.+1 pour la STL. les tableaux permettent RA Itérateurs. Pas besoin de std::vector.
Si vous allez utiliser le C++, alors vous pourriez aussi bien profiter de tout ce que la STL peut offrir.
OriginalL'auteur graham.reeds
vous pouvez remplir un tableau avec des nombres de 1 à 20 et de l'utilisation std::random_shuffle
remarque vous n'avez pas besoin d'un vecteur est un tableau simple fera.
exemple :
OriginalL'auteur f4.
Il y a la possibilité dans votre code d'une très longue course de la boucle. Si vous êtes à l'intérieur du while(!fait) en boucle il n'y a aucune garantie que vous aurez jamais fini. Évidemment, avec un tableau de 20 éléments, ce ne sera pas dans la pratique à un problème, mais il pourrait causer des problèmes si vous l'appliquer à grande échelle de plusieurs milliers d'éléments.
Plus fiable, la solution serait de remplir le tableau de façon séquentielle et ensuite mélanger par la suite.
rand()%N
serait également faible pour un grand N.Vous avez raison, si je échelle-à-dire 1 million d'éléments, il va sûrement y aura des problèmes de performances.
OriginalL'auteur Dolbz
Je l'avais mis les 20 nombres aléatoires dans un tableau, puis la copier à un autre de 20 élément de tableau, trier un tableau, et pour chaque nombre dans le tableau trié, trouver le nombre correspondant dans le tableau non trié, et de placer l'index de la sorte.
OriginalL'auteur Arthur Kalliokoski
Si vous pouvez utiliser des récipients, que je venais de remplir un std::set avec les nombres de 1 à 20.
Ensuite, vous pouvez tirer un nombre aléatoire à partir de votre jeu et de l'insérer dans le tableau.
OriginalL'auteur Christian Severin
D'autre voie possible
PS rempli avec des chiffres de 0 à 19 ans et pas de 1 à 20. Le même que l'original
rand() % left
- voir par exemple members.cox.net/srice1/random/crandom.htmlOriginalL'auteur drlazy
Exemple de Code pour de Fisher-Yates:
OriginalL'auteur Christoph
J'espère que ça aidera:
Vous trouverez ci-dessous le code complet:
Si vous souhaitez avoir de plus petits numéros que vous pouvez faire après la génération:
OriginalL'auteur Grzegorz Bazior
quelque chose comme cela?
OriginalL'auteur mhd