Comment puis-je choisir une chaîne aléatoire de mon tableau, mais ne pas sélectionner deux fois la même.
string[] names = { "image1.png", "image2.png", "image3.png", "image4.png", "image5.png" };
Est-ce possible? Je pensais à utiliser
return strings[random.Next(strings.Length)];
Mais cela a la possibilité de retourner deux fois la même chaîne. Ou est-ce que je me trompe? Devrais-je utiliser quelque chose d'autre comme un List
pour accomplir cela? Tous les commentaires sont les bienvenus.
Le moyen le plus simple (mais lent pour les grandes listes) serait d'utiliser un conteneur redimensionnable tel que List
et de supprimer un élément après l'avoir sélectionné. Comme:
var names = new List<string> { "image1.png", "image2.png", "image3.png", "image4.png", "image5.png" };
int index = random.Next(names.Count);
var name = names[index];
names.RemoveAt(index);
return name;
Lorsque votre liste est vide, toutes les valeurs ont été sélectionnées.
Un moyen plus rapide (surtout si votre liste est longue) serait d’utiliser un algorithme de réorganisation sur votre liste. Vous pouvez ensuite extraire les valeurs une à la fois. Ce serait plus rapide, car supprimer de la fin d'une List
est généralement beaucoup plus rapide que de supprimer du milieu. En ce qui concerne le brassage, vous pouvez consulter cette question pour plus de détails.
Essayez ce code ci-dessous
string[] Titles = { "Excellent", "Good", "Super", "REALLY GOOD DOCTOR!", "THANK YOU!", "THE BEST", "EXCELLENT PHYSICIAN", "EXCELLENT DOCTOR" };
comments_title.Value=Titles[new Random().Next(0,Titles.Length) ] ;
Vous pouvez mélanger le tableau dans un premier temps, puis simplement parcourir le tableau mélangé.
Cela présente l’avantage d’être O(n) par rapport à O (n ^ 2) que les implémentations basées sur RemoveAt
ont. Bien sûr, cela n’a pas beaucoup d’importance pour les tableaux courts.
Vérifiez la réponse de Jon Skeet à la question suivante pour une bonne implémentation de shuffe (toutes les commandes sont également probables): Utiliser Random et OrderBy est-il un bon algorithme de shuffle?
La meilleure chose à faire est simplement de créer une liste de doublons. Ensuite, si vous choisissez une chaîne au hasard, vous pouvez la supprimer de la liste de doublons afin de ne pas pouvoir la sélectionner deux fois.
La logique que vous pouvez utiliser est la suivante:
1) Choisissez un entier aléatoire sur la plage égale à la longueur de votre tableau. Vous pouvez le faire en utilisant la classe System.Random.
2) Utilisez la chaîne correspondant à cet index de tableau
3) Supprimer l'élément avec cet index du tableau (peut être plus facile avec une liste)
Ensuite, vous pouvez choisir à nouveau et la même chaîne ne s'affiche pas. Le tableau sera un élément plus court.
//SET LOWERLIMIT
cmd = new SqlCommand("select min(sysid) as lowerlimit from users", cs);
int _lowerlimit = (int) cmd.ExecuteScalar();
lowerlimit = _lowerlimit;
//SET UPPERLIMIT
cmd = new SqlCommand("select max(sysid) as upperlimit from users", cs);
int _upperlimit = (int) cmd.ExecuteScalar();
upperlimit = _upperlimit;
//GENERATE RANDOM NUMBER FROM LOWERLIMIT TO UPPERLIMIT
Random rnd = new Random();
int randomNumber = rnd.Next(lowerlimit, upperlimit+1);
//DISPLAY OUTPUT
txt_output.Text += randomNumber;
Vous devrez garder une trace de ceux que vous avez utilisés, de préférence dans une List
si vous ne voulez pas/ne pouvez pas modifier le tableau d'origine. Utilisez une boucle while
pour vérifier qu’elle n’a pas été utilisée, puis ajoutez-la à la liste "utilisé".
Utilisez la méthode ci-dessous
public static class ListExtensions
{
public static T PickRandom<T>(this List<T> enumerable)
{
int index = new Random().Next(0, enumerable.Count());
return enumerable[index];
}
}
Alors appelez le chemin ci-dessous
string[] fruitsArray = { "Apple", "orange"};
string inputString = fruitsArray.ToList().PickRandom();