如何从我的阵列中挑选一个随机字符串,而不是两次选择相同的字符串。
string[] names = { "image1.png", "image2.png", "image3.png", "image4.png", "image5.png" };
这可能吗?我正在考虑使用
return strings[random.Next(strings.Length)];
但这有可能两次返回相同的字符串。或者我错了吗?我应该使用像List
这样的其他东西来实现这一目标。欢迎任何反馈。
答案 0 :(得分: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;
如果您的列表为空,则会选择所有值。
更快的方法(特别是如果列表很长)将在列表中使用重排算法。然后,您可以一次弹出一个值。它会更快,因为从List
的末尾删除通常比从中间删除要快得多。至于改组,您可以查看this question了解更多详情。
答案 1 :(得分: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) ] ;
答案 2 :(得分:5)
您可以在第一步中对数组进行洗牌,然后简单地遍历洗牌数组
与基于RemoveAt
的实现具有的O(n ^ 2)相比,这具有O(n)的优点。当然,这对于短阵列来说并不重要。
检查Jon Skeet对以下问题的回答是好的(所有订单同样可能)实施shuffe:Is using Random and OrderBy a good shuffle algorithm?
答案 3 :(得分:2)
最好的办法就是创建一个重复的列表,然后当你随机挑出一个字符串时,可以将它从重复的列表中删除,这样就不会选择它了两次。
答案 4 :(得分:2)
您可以使用的逻辑如下:
1)在等于数组长度的范围内选择一个随机整数。您可以使用System.Random类执行此操作。
2)使用与该数组索引相对应的字符串
3)从数组中删除带有该索引的项目(使用列表可能更容易)
然后你可以再次选择,不会出现相同的字符串。该数组将是一个较短的元素。
答案 5 :(得分:1)
如果您不想/不能修改原始数组,您需要跟踪已使用的数据,最好是List
。使用while
循环检查它是否已被使用,然后将其添加到“已使用”列表中。
答案 6 :(得分:1)
//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;
答案 7 :(得分:1)
使用以下实用程序方法
public static class ListExtensions
{
public static T PickRandom<T>(this List<T> enumerable)
{
int index = new Random().Next(0, enumerable.Count());
return enumerable[index];
}
}
然后调用以下方式
string[] fruitsArray = { "apple", "orange"};
string inputString = fruitsArray.ToList().PickRandom();