Non répétition de nombres aléatoires en Objective-C
Je suis en utilisant
for (int i = 1, i<100, i++)
int i = arc4random() % array count;
mais je le répète à chaque fois. Comment puis-je remplir le choisi int
la valeur de la plage, de sorte que, lorsque le programme des boucles, je ne sera pas dupe?
voir stackoverflow.com/questions/1608181/...
Si vous ne voulez pas de doubles, alors vous n'êtes pas à la recherche pour le hasard en.wikipedia.org/wiki/Randomness , on dirait que vous êtes à la recherche pour une étude randomisée de brassage algorithme en.wikipedia.org/wiki/Random_permutation
Merci Maggie après une lecture rapide sur traînant je pense que c'est l'algorithme im recherchez.
Voir stackoverflow.com/questions/196017/unique-random-numbers-in-o1
Si vous ne voulez pas de doubles, alors vous n'êtes pas à la recherche pour le hasard en.wikipedia.org/wiki/Randomness , on dirait que vous êtes à la recherche pour une étude randomisée de brassage algorithme en.wikipedia.org/wiki/Random_permutation
Merci Maggie après une lecture rapide sur traînant je pense que c'est l'algorithme im recherchez.
Voir stackoverflow.com/questions/196017/unique-random-numbers-in-o1
OriginalL'auteur Drahc | 2009-10-24
Vous devez vous connecter pour publier un commentaire.
Il semble que vous voulez de brassage d'un ensemble plutôt que de "vrai" hasard. Il suffit de créer un tableau où toutes les positions correspondent aux numéros et initialiser un compteur:
Ensuite, chaque fois que vous voulez un nombre aléatoire, utilisez la méthode suivante:
Cela renvoie une valeur aléatoire à partir d'une diminution de la piscine, garantissant pas de répétitions. Vous devez vous méfier de la piscine, descendant de la taille zéro, bien sûr, et intelligemment ré-initialiser la piscine.
C'est une solution déterministe que de garder une liste de numéros utilisés et de continuer à boucle jusqu'à ce que vous trouver un pas dans cette liste. La performance de ce type d'algorithme se dégrade à mesure que la piscine est petite.
Une fonction C à l'aide des valeurs statiques quelque chose comme cela devrait faire l'affaire. Appeler avec
pour définir la piscine (avec n'importe quel nombre supérieure ou égale à zéro qui spécifie la taille) ou
pour obtenir le nombre suivant de la piscine (un nombre négatif suffit). Si la fonction ne peut pas allouer suffisamment de mémoire, il sera de retour -2. Si il n'y a pas de chiffres à gauche dans la piscine, il sera de retour -1 (à quel point vous pourriez re-initialiser la piscine si vous le souhaitez). Voici la fonction avec une unité de test principal pour vous d'essayer:
Et voici la sortie d'un run:
Gardez à l'esprit que, parce qu'il utilise la statique, il n'est pas sûr d'appeler à partir de deux endroits différents, s'ils veulent maintenir leurs propres piscines séparées. Si c'était le cas, la statique serait remplacé par un tampon (en tenant comte et de la piscine) qui "appartiennent" à l'appelant (un double pointeur peut être transmis à cet effet).
Et, si vous êtes à la recherche pour les multiples "piscine" de la version, je l'inclus ici par souci d'exhaustivité.
Comme vous pouvez le voir à partir de la modification de la
main()
, vous devez d'abord initialiser unint
pointeur versNULL
puis de les transmettre, à son adresse, à lamyRandom()
fonction. Cela permet à chaque client (emplacement dans le code) à avoir leur propre piscine qui est automatiquement attribué et libéré, bien que vous pouvez toujours partager des piscines si vous le souhaitez.200 numéros n'est pas beaucoup. Je vais ajouter une fonction C pour vous donner un début.
lolz. Et ici, je suis inquiétant mem consommation. Merci pour votre aide im vraiment les jeunes à la programmation.
Pas de problèmes. J'espère que je serai à la retraite avant de pouvoir présenter aucune menace pour mon travail 🙂
wow, c'était rapide. Merci pax im vais essayer plus tard. Merci encore.
OriginalL'auteur paxdiablo
Vous pouvez utiliser Format De La Préservation De Chiffrement pour chiffrer un compteur. Votre compteur va de 0 vers le haut, et le chiffrement utilise une clé de votre choix pour en faire un apparemment aléatoire de la valeur de ce que radix et la largeur que vous voulez.
Algorithmes de chiffrement par bloc ont normalement une taille de blocs fixe, par exemple, de 64 ou 128 bits. Mais le Format de la Préservation de Chiffrement permet de prendre un standard de chiffrement comme AES et faire une plus petite largeur de chiffre, quelle que soit radix et la largeur que vous voulez (par exemple, radix 2, largeur 16), avec un algorithme qui est toujours du point de vue cryptographique robuste.
C'est la garantie de ne jamais avoir de collisions (parce que les algorithmes de chiffrement créer un mappage 1:1). Il est également réversible (un 2-way cartographie), de sorte que vous pouvez prendre le nombre qui en résulte et de revenir à la contre-valeur de départ.
AES-FFX est un projet de norme sur la méthode pour y parvenir. J'ai expérimenté avec quelques notions de code Python qui est basé sur la norme AES-FFX idée, bien que pas totalement conforme--voir le code Python ici. Il peut, par exemple, de chiffrer un compteur aléatoire à la recherche de 7 chiffres, nombre décimal, ou 16 bits.
OriginalL'auteur Craig McQueen
Vous avez besoin de garder une trace des numéros que vous avez déjà utilisé (par exemple, dans un tableau). Obtenir un nombre aléatoire, et le jeter si elle a déjà été utilisée.
OriginalL'auteur driis
Sans compter sur externe stochastique processus, comme la décroissance de la radioactivité ou de la saisie de l'utilisateur, les ordinateurs seront toujours de générer des nombres pseudo-aléatoires - qui sont des chiffres qui ont de nombreuses propriétés statistiques des nombres aléatoires, mais répéter des séquences.
C'est ce qui explique les suggestions pour aléatoirement l'ordinateur est sortie en mélangeant.
Jeter précédemment utilisé des nombres, on peut allonger la séquence artificielle, mais à un coût pour les statistiques qui donnent l'impression d'aléatoire.
OriginalL'auteur pavium
La meilleure façon de le faire est de créer un tableau pour les numéros déjà utilisé. Après un nombre aléatoire a été créé, puis l'ajouter à la matrice. Ensuite, lorsque vous allez créer un autre nombre aléatoire, de s'assurer qu'il n'est pas dans le tableau des numéros utilisés.
OriginalL'auteur GaryDevenay
En plus de l'utilisation secondaire de tableau pour stocker déjà numéros aléatoires générés, invoquant le hasard n'. l'ensemencement de la fonction avant chaque appel de hasard non. fonction de génération pourrait aider à générer des différents seq. de nombres aléatoires dans chaque course.
OriginalL'auteur sdp07