2016-09-22 118 views
1

美好的一天我有一些关于从我的字符串数组中选择一个随机字符串的问题我目前正在开发一个猜字游戏。 这是我的字符串数组:从字符串数组中随机选择不重复

string[] movie = {"deadpool", "batmanvssuperman", "findingdory", "titanic", "suicidesquad", "lordoftherings", "harrypotter", "jurassicpark", "hungergames", "despicableme" }; 

,而这是在选择一个随机字符串,以我的数组的过程中,我应该做下一个,因为我要选择不重复的字符串。 例如 当程序启动时,它将选择一个字符串,然后当我再次选择随机字符串时,我想不选择先前已选择的单词。

string word = movie[r.Next(0, movie.Length)].ToUpper(); 

感谢您的回复!祝你今天愉快。

+0

最经典的方法是创建一个洗牌阵列,而不是从原始数组随意挑选, – unwind

回答

1

只要循环,如果它被选中。这是未经测试的代码:

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;  
} 

这应该可以在应用程序启动时选择初始字符串。

+0

使用这种方法有一个非常小的机会,你可以为一个不可接受的长时间循环选择别的东西之前。尽管如此,我不会担心。 – Riley

+0

这将确保当前的选择不是最后的选择,但无法确保每个选择都是唯一的。 –

+0

它更有可能在彩票中赢得一百万,而不是用户会注意到方法调用。你只需要处理没有或只有一个动态的情况;-) –

3

好,只需将您的数组列表和随机顺序将它洗:

 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 

我有点喜欢用队列集合这里:

var moviesQueue = new Queue<string>(randomMovies);  

while (moviewQueue.Count > 0) 
{ 
    Console.WriteLine(moviewQueue.Dequeue()); 
} 

PS 建议您不需要从randomMovie中删除元素,您可以将最后使用的索引保存在某个字段中,稍后再使用它;

var lastIndex = 0; 
var randomMovie = randomMovies[lastIndex++]; 
+0

一旦完成,这会产生副作用或毁坏您的列表。 –

+0

但是你可以随时复制列表,如果你需要'randomMovies.ToList()'方法的帮助 – Fabjan

+0

帮助最好的答案,但你不需要删除元素。你可以只保留一个索引指针,像'int CurrentMovieIdx'。 – u8it

0

如果你需要保持记忆,转换您的列表是包含名称和是否已选择或无法在现场的一类。

如果你经历了所有这些,关闭这个半仙并重新开始。

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; 
} 
}