从没有重复的字符串数组中随机选择
本文关键字:数组 随机 选择 字符串 | 更新日期: 2023-09-27 18:08:15
您好,我有一些关于从我的字符串数组中选择随机字符串的问题,我目前正在开发一个猜字游戏。
string[] movie = {"deadpool", "batmanvssuperman", "findingdory", "titanic", "suicidesquad", "lordoftherings", "harrypotter", "jurassicpark", "hungergames", "despicableme" };
虽然这是选择一个随机字符串到我的数组的过程,我应该做什么,因为我想选择字符串不重复。如当程序启动时,它会选择一个字符串,然后当我再次选择随机字符串时,我不想选择之前已经选择过的前一个单词。
string word = movie[r.Next(0, movie.Length)].ToUpper();
感谢您的回复!祝你过得愉快。
那么,只需将数组转换为列表并按随机顺序对其进行洗牌:
var rand = new Random();
string[] movies = { "deadpool", "batmanvssuperman", "findingdory", "titanic", "suicidesquad", "lordoftherings", "harrypotter", "jurassicpark", "hungergames", "despicableme" };
List<string> randomMovies = movies.ToList();
for (int i = 0; i < movies.Length / 2; i++)
{
var randNum = rand.Next(i, randomMovies.Count);
var temp = randomMovies[randNum];
randomMovies[randNum] = randomMovies[i];
randomMovies[i] = temp;
}
然后你可以取随机元素:
var randomMovie = randomMovies.First();
randomMovies.Remove(randomMovie); // either remove it or use loop to iterate through the list
我喜欢在这里使用Queue collection:
var moviesQueue = new Queue<string>(randomMovies);
while (moviewQueue.Count > 0)
{
Console.WriteLine(moviewQueue.Dequeue());
}
注:建议你不需要从randomMovie中删除元素,你可以保存最后使用的索引在一些字段,以后使用它;
var lastIndex = 0;
var randomMovie = randomMovies[lastIndex++];
如果已被选中则循环。这是未经测试的代码:
private string _last;
private string GetNonRepeatedMovie()
{
string selected = "";
do
{
selected = movie[r.Next(0, movie.Length)].ToUpper();
}
while (selected == this._last);
this._last = selected;
return selected;
}
这应该可以在应用程序启动时选择初始字符串
如果您需要保留内存,请将列表转换为包含名称和是否已选择的字段的类。
如果您遍历了所有这些,请关闭此半象限并重新开始。
class GuessingName
{
public GuessingName(string name){Name = name;}
public string Name;
public bool chosen;
}
class RandomNamePicker{
private List<GuessingName> names;
public RandomNamePicker(){
names = new List<GuessingName>();
names.Add(new GuessingName("movie"));
}
string RandomPicker(){
if(names.All(c=>c.chosen))
names.ForEach(c=>c.chosen=false);
int r1 = r.Next(0, names.Length);
while(names[r1].chosen){
r1= r.Next(0,names.Length);
}
return names[r1].Name;
}
}