从数组中选择随机字符串

atr*_*joe 26 c# arrays string random

如何从我的阵列中挑选一个随机字符串,但不要两次选择相同的字符串.

string[] names = { "image1.png", "image2.png", "image3.png", "image4.png", "image5.png" };
Run Code Online (Sandbox Code Playgroud)

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

return strings[random.Next(strings.Length)];
Run Code Online (Sandbox Code Playgroud)

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

Eti*_*tel 38

最简单的方法(但对于大型列表来说速度慢)可能是使用可调整大小的容器,List并在选择后删除元素.喜欢:

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;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 请注意,如果列表很长,这可能是一个坏主意.从长列表的开头附近删除项目必须移动后面的所有项目. (2认同)

小智 30

请尝试以下代码

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) ] ;
Run Code Online (Sandbox Code Playgroud)

  • 将来,请尝试在帖子中添加更多说明.好主意虽然!:) (4认同)
  • @Gober上限是独家的,因此不会出现问题:https://msdn.microsoft.com/en-us/library/2dx6wyd4(v = vs.110).aspx (3认同)

Cod*_*aos 5

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

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