Comment puis-je faire cela, mais pour que je puisse vérifier si la valeur est déjà dans le tableau et le cas échéant générer une nouvelle valeur
Vous ne faites pas cela, jamais, parce que est une très mauvaise idée.
Pour illustrer pourquoi il est une très mauvaise idée, envisager une autre version du même problème: trier un million de numéros dans un ordre aléatoire par le procédé suivant:
- Choisissez un numéro un à un million.
- Vérifiez pour voir si elle est déjà dans la liste.
- Si c'est le cas, retournez à l'étape 1
- Sinon, ajoutez le numéro à la liste.
- La liste contient-elle un million d'éléments? Si oui, vous avez terminé. Si ce n'est pas le cas, retournez à l'étape 1.
Cela fonctionne clairement. Est-ce que c'est une bonne idée? Supposons que vous avez presque fini. La liste contient 999999 articles. Le seul élément manquant est 857313. Que faites-vous? Vous choisissez un nombre aléatoire, par exemple, 12. Maintenant, vous vérifiez les 999999 éléments de la liste pour voir si l'un d'entre eux sont 12. 12 aurait pu être l'un des premiers numéros que vous avez choisi, il peut donc être rapide pour le trouver. Ou il pourrait être l'un des derniers, donc cela prendra beaucoup de temps. En moyenne, il faudra 500 000 vérifications pour voir si 12 est sur la liste. Et c'est le cas, car il n'y a qu'un seul nombre manquant dans la liste.
12 ne fonctionne pas. Revenez au début. Choisissez un autre nombre aléatoire, disons, 53259. Est-ce que c'est sur la liste? Encore un demi-million de chèques. Continuez à le faire jusqu'à ce que vous générez 857313, ce qui arrive un million d'essais.Donc, en moyenne, mettre le dernier élément de la liste prend 500000 x 1000000 = cinq cent milliards de comparaisons. Cela pourrait prendre plus de temps. Cela pourrait prendre plusieurs milliers de milliards de comparaisons. Ou vous pourriez avoir de la chance et il en faut un. Mais en moyenne, un demi-billion de comparaisons.
Ceci est un terrible façon de produire un ordre aléatoire d'une liste.
Il existe deux méthodes pour effectuer un classement aléatoire d'une liste.
(1) Faire un appareil qui peut trier une liste en fonction d'une commande. Fournir un stable en fonction d'une graine aléatoire.
Notez que vous devriez pas produire un ordre aléatoire en faisant une méthode qui renvoie des résultats aléatoires lorsqu'on lui demande "est plus grand que B?" C'est un ordre instable; de nombreux algorithmes de tri sont basés sur un ordre de tri stable et vont dans des boucles infinies ou ont d'autres mauvais comportements quand on leur donne un ordre de tri instable.
Cet algorithme est O (n lg n) et a la bonne propriété d'écrire très facilement des parties standard, comme d'autres réponses l'indiquent. Il est également extrêmement rapide pour les petites listes dans les implémentations typiques.
(2) Choisissez un article par index à partir d'une liste source au hasard, en supprimant de la liste des sources que vous allez, et en le mettant sur la liste de destination. Ce dernier est connu sous le nom de Knuth Shuffle ou Fischer-Yates Shuffle, et il s'agit d'un algorithme très rapide. Vous pouvez le faire "en place", en faisant muter un tableau existant dans l'ordre mélangé, ou en créant une nouvelle liste. Il a aussi la belle propriété que vous pouvez "payer pour jouer", mélanger le "haut" de la liste que vous en avez besoin. Si vous avez un million d'objets à mélanger mais que vous n'avez besoin que des cent premiers, vous pouvez simplement définir l'ordre de tri pour la première centaine et l'appeler bien.
Odeur comme des devoirs, surtout avec les commentaires ci-dessous les (valides, bonnes) suggestions avec un squelette qui semble faire partie de la tâche: "Commencez avec ce code" –
oui c'est en effet une partie de devoirs je ne sais pas va mentir à ce sujet je suis coincé dans une partie et je veux des conseils/commentaires qui ne sont pas mauvais je suppose – ShallowHeart
indentation du code correct et de meilleurs noms de variables aiderait les gens à comprendre votre code et par conséquent vous donner de meilleures solutions. – CesarGon