从字符串数组中随机选择而不重复

时间:2016-09-22 14:29:15

标签: c# arrays string random

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

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

虽然这是为我的数组选择随机字符串的过程,但我接下来该怎么做,因为我想选择不重复的字符串。 例如 当程序启动时,它会选择一个字符串,然后当我再次选择随机字符串时,我想不选择我之前已经选择的前一个单词。

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

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

3 个答案:

答案 0 :(得分:2)

好吧,只需将您的数组转换为list并按随机顺序对其进行随机播放:

        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集合:

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

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

P.S。 如你所知,你真的不需要删除randomMovie中的元素,你可以在一些字段中保存最后使用的索引并在以后使用它;

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

答案 1 :(得分:1)

如果已经选择,则循环。这是未经测试的代码:

        URL url = new URL("http://www.avajava.com/images/avajavalogo.jpg");
        BufferedImage img = ImageIO.read(url);
        File file = new File("D:\\image\\downloaded.jpg");
        ImageIO.write(img, "jpg", file);

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

答案 2 :(得分: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;
 }
}