从数组中选择随机字符串
本文关键字:随机 字符串 选择 数组 | 更新日期: 2023-09-27 18:02:40
如何从数组中选择一个随机字符串,而不是两次选择相同的字符串?
string[] names = { "image1.png", "image2.png", "image3.png", "image4.png", "image5.png" };
这可能吗?我在考虑使用
return strings[random.Next(strings.Length)];
但是这有可能两次返回相同的字符串。还是我错了?我应该用其他的东西,比如List
来完成这个吗?
最简单的方法(但对于大列表来说速度很慢)是使用像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
的末端移除通常比从中间移除要快得多。至于洗牌,您可以查看这个问题以了解更多细节。
试试下面的代码
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
的实现的0 (n^2)相比,这具有0 (n)的优势。当然,这对于短数组来说并不重要。
检查Jon Skeet对以下问题的回答,以获得一个好的(所有顺序的可能性都相等)洗牌实现:使用Random和OrderBy是一个好的洗牌算法吗?
最好的方法是创建一个重复列表,然后当你随机挑选一个字符串时,你可以从重复列表中删除它,这样你就不能再挑选它了。
您可以使用的逻辑如下:
1)在等于数组长度的范围内随机选择一个整数。您可以使用系统来完成此操作。随机类。
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<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();