web-dev-qa-db-fra.com

Choisir une chaîne aléatoire dans un tableau

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.

25
atrljoe

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.

36
Etienne de Martel

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) ] ;
29
Bharat Kumar

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?

5
CodesInChaos

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.

2
Icemanind

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.

2
samb8s
//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;
1
devkiat

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é".

1
Evan Mulawski

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();
1
Siddarth Kanted