Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从数组中选取随机字符串_C#_Arrays_String_Random - Fatal编程技术网

C# 从数组中选取随机字符串

C# 从数组中选取随机字符串,c#,arrays,string,random,C#,Arrays,String,Random,如何从数组中选择一个随机字符串,但不选择同一个字符串两次 string[] names = { "image1.png", "image2.png", "image3.png", "image4.png", "image5.png" }; 这可能吗?我在考虑使用 return strings[random.Next(strings.Length)]; 但这有可能返回相同的字符串两次。还是我错了?我是否应该使用类似于列表的其他方法来完成此任务。欢迎任何反馈。最简单的方法(但对于大型列表来说速度

如何从数组中选择一个随机字符串,但不选择同一个字符串两次

string[] names = { "image1.png", "image2.png", "image3.png", "image4.png", "image5.png" };
这可能吗?我在考虑使用

return strings[random.Next(strings.Length)];
但这有可能返回相同的字符串两次。还是我错了?我是否应该使用类似于
列表的其他方法来完成此任务。欢迎任何反馈。

最简单的方法(但对于大型列表来说速度较慢)是使用可调整大小的容器,如
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;
var name=新列表{“image1.png”、“image2.png”、“image3.png”、“image4.png”、“image5.png”};
int index=random.Next(names.Count);
变量名称=名称[索引];
名称。删除(索引);
返回名称;
当列表为空时,将拾取所有值


一个更快的方法(特别是如果你的列表很长的话)是在你的列表上使用一个洗牌算法。然后可以一次弹出一个值。它会更快,因为从
列表的末尾删除通常比从中间删除快得多。至于洗牌,您可以查看更多详细信息。

最好创建一个重复列表,然后当您随机挑选字符串时,可以将其从重复列表中删除,这样您就不能再挑选两次。

可以使用的逻辑如下:

1) 在等于数组长度的范围内选择一个随机整数。您可以使用System.Random类来完成此操作

2) 使用与该数组索引对应的字符串

3) 从数组中删除具有该索引的项(使用列表可能更容易)


然后您可以再次拾取,相同的字符串将不会出现。数组将短一个元素。

如果不想/无法修改原始数组,则需要跟踪已使用的元素,最好是在
列表中。使用
while
循环检查它是否未被使用,然后将其添加到“已使用”列表中。

您可以在第一步中洗牌数组,然后简单地在洗牌数组上迭代。
与基于
RemoveAt
的实现所具有的O(n^2)相比,这具有O(n)的优势。当然,这对于短数组没有多大关系

查看Jon Skeet对以下问题的回答,了解shuffe的良好实现(所有订单的可能性相同):

尝试下面的代码

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) ] ;

使用下面的实用方法

public static class ListExtensions
{
    public static T PickRandom<T>(this List<T> enumerable)
    {
        int index = new Random().Next(0, enumerable.Count());
        return enumerable[index];
    }
}

这听起来像是要洗牌数组,然后正常地迭代数组。关于堆栈溢出,有很多洗牌问题。@Atrljoe-你知道返回同一个字符串两次是随机的,对吗?如果你不想得到两倍于你想要的相同结果,就不能将其描述为随机结果。@Ramhound当然是随机的。它不会是一系列独立的事件,但仍然是随机的。@ramhound我知道它不是完全随机的,但在这种情况下,如果我要求用户选择一个图像,并且它随机返回所有相同的图像(非常不可能,但理论上可能),那么用户就别无选择。我不需要它完美到足以得到随机的结果。我已经回答了这个[数组中的随机项][1][1]:@samb8s是的,但我更快了:)注意,如果列表很长,这可能是个坏主意。从一个长列表的开头删除一个项目必须移动它后面的所有项目。好的,假设原始列表中有1000个项目,而“已使用”列表中有999个项目。你的计划是继续生成随机数,直到达到千分之一?您的列表选取算法将变得越来越慢。对于较长的列表,这是一个糟糕的算法。将来,尝试在您的帖子中添加更多的描述。好主意!:)我一直认为所有的评论都是诚实的,不是自动的,而那些得到好评的评论实际上是好的。如果它选择了最大值(Titles.Length),这将导致IndexOutOfRangeException。否则它工作得很好。(只做Titles.Length-1)@Gober上限是排他性的,所以这不会是一个问题:为什么我生成的结果总是给我相同的数字?
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();