Générateur de nombre aléatoire sans doubles en Javascript?
J'ai besoin d'aide avec l'écriture du code qui permettra de créer un nombre aléatoire à partir d'un tableau de 12 numéros et de les imprimer 9 fois sans dupes. Cela a été difficile pour moi de l'accomplir. Des idées?
La plupart de façon efficace de le faire est de mélanger vos numéros ensuite imprimer les neuf premiers d'entre eux. Utiliser un bonne lecture aléatoire de l'algorithme.Ce Thilo proposé peut vous donner des résultats médiocres. Voir ici.
Modifier
Voici un bref Knuth Shuffle algorithme exemple:
void shuffle(vector<int> nums){for(int i = nums.size()-1; i >=0; i--){//this line is really shorthand, but gets the point across, I hope.
swap(nums[i],nums[rand()%i]);}}
En utilisant les algorithmes éprouvés vous suggérons de ne sembler une bonne idée si on est sérieux à ce sujet. Je voudrais juste faire remarquer que l'algorithme que je suggère n'est pas le seul discuté de façon défavorable dans "voir ici". Ce n'est pas le même algorithme, pas. Mais j'ai peur que cela ne continuent de produire de l'erreur même si je comprends droit. Il y a n^3 résultats pour votre algorithme qui va atterrir dans l'une des n! les boîtes. Qui ne peut pas donner une même distribution. Essayez de l'expérience dans l'article avec votre algorithme et voir si cela fonctionne. Dans les commentaires sur le blog, vous lié, "mon" algorithme est mis en place par "fabio". Il affirme qu'il fonctionne, mais avec un plus grand nombre de swaps (et pas seulement de la taille de la matrice). Je vais lire un peu plus, et voir si je peux prouver que c'est bien ou mal. Andrew Dunn de la proposition ci-dessous semble statistiquement correct, trop, même si elle a des problèmes de performances. J'ai regardé ce commentaire vous l'avez souligné. J'ai toujours l'impression que le nombre de chemins d'accès doivent être divisible par n! pour s'adapter de manière égale dans les n! les résultats, mais je me trompe peut-être. Je serais intéressé de voir ce que vous trouvez la comparaison de l'algorithme de Knuth à la vôtre côté par côté. Et oui, Dunn de l'algorithme devrait fonctionner (en dépit de la performance). Je suis de le prendre pour les statisticiens: stats.stackexchange.com/questions/3082/...
C'est relativement simple à faire, la théorie derrière cela est de créer un autre tableau qui garde la trace de ces éléments du tableau que vous avez utilisé.
var tempArray =newArray(12),i,r;for(i=0;i<9;i++){
r =Math.floor(Math.random()*12);//Get a random indexif(tempArray[r]===undefined)//If the index hasn't been used yet{
document.write(numberArray[r]);//Display it
tempArray[r]=true;//Flag it as have been used}else//Otherwise{
i--;//Try again}}
D'autres méthodes consistent à brouiller le tableau, le retrait a utilisé des éléments de la matrice, ou de déplacer les éléments utilisés à la fin du tableau.
Ne pas utiliser le code ci-dessus pour les professionnels fonctionne bien, il est extrêmement simple, à titre d'exemple pour illustrer la logique derrière ce que vous essayez de le faire (l'impression des 9 valeurs à partir d'un tableau de 12 valeurs dans un ordre aléatoire). Il ne semble pas produire un estimateur sans biais de la séquence de nombres. Le seul problème que je peux voir, c'est la performance qu'il devient de plus en plus difficile de trouver les nombres restants. Exactement, alors que cet algorithme sera suffisant pour les ensembles de données plus petits, pour les grands ensembles, vous devez vous assurer que les collisions ne se produisent pas, soit par suppression de données de la matrice, ou en le poussant jusqu'à la fin.
Si je vous comprends bien, vous voulez mélanger votre tableau.
Boucle une couple de fois (longueur de tableau doit le faire), et à chaque itération, obtenir deux d'ensemble aléatoire d'index et de permuter les deux éléments. (Mise à jour: si vous êtes vraiment sérieux à ce sujet, cela peut ne pas être la meilleur algorithme).
Vous pouvez ensuite imprimer les neuf premiers éléments d'un tableau, qui sera dans un ordre aléatoire et ne se répètent pas.
OriginalL'auteur Jacob Relkin
La plupart de façon efficace de le faire est de mélanger vos numéros ensuite imprimer les neuf premiers d'entre eux. Utiliser un bonne lecture aléatoire de l'algorithme.Ce Thilo proposé peut vous donner des résultats médiocres. Voir ici.
Modifier
Voici un bref Knuth Shuffle algorithme exemple:
Ce n'est pas le même algorithme, pas. Mais j'ai peur que cela ne continuent de produire de l'erreur même si je comprends droit. Il y a n^3 résultats pour votre algorithme qui va atterrir dans l'une des n! les boîtes. Qui ne peut pas donner une même distribution. Essayez de l'expérience dans l'article avec votre algorithme et voir si cela fonctionne.
Dans les commentaires sur le blog, vous lié, "mon" algorithme est mis en place par "fabio". Il affirme qu'il fonctionne, mais avec un plus grand nombre de swaps (et pas seulement de la taille de la matrice). Je vais lire un peu plus, et voir si je peux prouver que c'est bien ou mal. Andrew Dunn de la proposition ci-dessous semble statistiquement correct, trop, même si elle a des problèmes de performances.
J'ai regardé ce commentaire vous l'avez souligné. J'ai toujours l'impression que le nombre de chemins d'accès doivent être divisible par n! pour s'adapter de manière égale dans les n! les résultats, mais je me trompe peut-être. Je serais intéressé de voir ce que vous trouvez la comparaison de l'algorithme de Knuth à la vôtre côté par côté. Et oui, Dunn de l'algorithme devrait fonctionner (en dépit de la performance).
Je suis de le prendre pour les statisticiens: stats.stackexchange.com/questions/3082/...
OriginalL'auteur JoshD
Essayer cette fois:
OriginalL'auteur Sudhir Bastakoti
C'est relativement simple à faire, la théorie derrière cela est de créer un autre tableau qui garde la trace de ces éléments du tableau que vous avez utilisé.
D'autres méthodes consistent à brouiller le tableau, le retrait a utilisé des éléments de la matrice, ou de déplacer les éléments utilisés à la fin du tableau.
Il ne semble pas produire un estimateur sans biais de la séquence de nombres. Le seul problème que je peux voir, c'est la performance qu'il devient de plus en plus difficile de trouver les nombres restants.
Exactement, alors que cet algorithme sera suffisant pour les ensembles de données plus petits, pour les grands ensembles, vous devez vous assurer que les collisions ne se produisent pas, soit par suppression de données de la matrice, ou en le poussant jusqu'à la fin.
OriginalL'auteur Randy the Dev
Si je vous comprends bien, vous voulez mélanger votre tableau.
Boucle une couple de fois (longueur de tableau doit le faire), et à chaque itération, obtenir deux d'ensemble aléatoire d'index et de permuter les deux éléments. (Mise à jour: si vous êtes vraiment sérieux à ce sujet, cela peut ne pas être la meilleur algorithme).
Vous pouvez ensuite imprimer les neuf premiers éléments d'un tableau, qui sera dans un ordre aléatoire et ne se répètent pas.
OriginalL'auteur Thilo
Voici un générique façon d'obtenir des nombres aléatoires entre min et max sans doublons:
appel avec:
OriginalL'auteur cologne