从数组中选择随机字符串

时间:2011-07-14 14:49:59

标签: c# arrays string random

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

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

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

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

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

8 个答案:

答案 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();