从数组中选择随机字符串

如何从我的arrays中挑选一个随机字符串,而不是两次选择相同的字符串。

string[] names = { "image1.png", "image2.png", "image3.png", "image4.png", "image5.png" }; 

这可能吗? 我正在考虑使用

 return strings[random.Next(strings.Length)]; 

但这有可能两次返回相同的字符串。 或者我错了吗? 我应该使用像List这样的其他东西来实现这一目标。 欢迎任何反馈。

最简单的方法(但对于大型列表来说很慢)将使用像List这样的可resize的容器,并在选择后删除元素。 喜欢:

 var names = new List { "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; 

当您的列表为空时,将选择所有值。

更快的方法(特别是如果你的列表很长)将在你的列表上使用一个改组算法。 然后,您可以一次弹出一个值。 它会更快,因为从List的末尾删除通常比从中间删除要快得多。 至于改组,您可以查看此问题以获取更多详细信息。

请尝试以下代码

 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) ] ; 

您可以在第一步中对数组进行混洗,然后简单地遍历混洗数组。
与基于RemoveAt的实现具有的O(n ^ 2)相比,这具有O(n)的优点。 当然,这对于短arrays来说并不重要。

检查Jon Skeet对以下问题的回答是好的(所有订单都同样可能)shuffe的实现: 使用Random和OrderBy是一个很好的shuffle算法吗?

最好的办法就是创建一个重复的列表,然后当你随机挑出一个字符串时,你可以将它从重复列表中删除,这样你就不能选择它两次。

您可以使用的逻辑如下:

1)在等于数组长度的范围内选择一个随机整数。 您可以使用System.Random类执行此操作。

2)使用与该数组索引对应的字符串

3)从数组中删除带有该索引的项目(使用列表可能更容易)

然后你可以再次选择,不会出现相同的字符串。 该数组将是一个较短的元素。

如果您不想/不能修改原始数组,则需要跟踪已使用的数据,最好是在List 。 使用while循环检查它是否未被使用,然后将其添加到“used”列表中。

 //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; 

使用以下实用程序方法

 public static class ListExtensions { public static T PickRandom(this List enumerable) { int index = new Random().Next(0, enumerable.Count()); return enumerable[index]; } } 

然后拨打以下方式

 string[] fruitsArray = { "apple", "orange"}; string inputString = fruitsArray.ToList().PickRandom();