如何从我的数组中随机选择一个字符串,但不重复选择同一个字符串。
string[] names = { "image1.png", "image2.png", "image3.png", "image4.png", "image5.png" };
这是可能的吗?我在考虑使用
return strings[random.Next(strings.Length)];
但是这种方法有可能返回相同的字符串两次。我是否理解错误?是否应该使用像List
这样的东西来完成这个任务?欢迎任何反馈。
如何从我的数组中随机选择一个字符串,但不重复选择同一个字符串。
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) ] ;
new Random()
,因为它会在调用太早的情况下每次都给你相同的数字。在循环外声明一个Random对象,并在循环内使用该引用。 - Vishnu BabuRemoveAt
的实现,这样做的优点在于时间复杂度为 O(n),而不是 O(n^2)。当然,对于短数组来说这并不重要。最好的方法就是创建一个副本列表,然后在随机选择字符串时,您可以从副本列表中删除它,以便您不能选择两次。
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();
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;