从列表中随机选择随机。如果它不是所选择的,请选择另一个。

时间:2014-04-01 10:25:45

标签: c# list random

我猜这个数字游戏。用户想到一个号码,计算机就会猜到它。我有这个代码,但问题是,计算机的每次尝试都有可能随机数会重复。我想知道如何创建一个随机列表,计算机将从列表中选择一个数字,如果它不正确我想删除该号码,这样它就不会被重新拾取。我是这个领域的新人,所以我真的很感激任何帮助。

private void btnStartTheGame_Click(object sender, EventArgs e)
{
    int guessTheNumber = Convert.ToInt32(txtNumberGuess.Text);
    DialogResult dialogResult;
    do
    {
        Random newNumberGenerator = new Random();
        number = newNumberGenerator.Next(0, 10);
        dialogResult = MessageBox.Show("Is number" + number.ToString() + " you are thinking about?", "Answer the question!", MessageBoxButtons.YesNo);
    }while (dialogResult == DialogResult.No);

    MessageBox.Show("Congratulation! You guessed the number!!");       
}

3 个答案:

答案 0 :(得分:0)

List<int> randomNumbers = Enumerable.Range(0,10).ToList();
DialogResult dialogResult;
Random newNumberGenerator = new Random();
do
{
    int index = newNumberGenerator.Next(0, randomNumbers.Count);
    dialogResult = MessageBox.Show("Is number" + randomNumbers[index] + " you are thinking about?", "Answer the question!", MessageBoxButtons.YesNo);
    if(dialogResult==DialogResult.No)
    {
        randomNumbers.RemoveAt(index);
    }
}
while (dialogResult == DialogResult.No);

答案 1 :(得分:0)

这是一个简短但完整的程序,可以根据需要执行(我使用的是控制台应用程序而不是表单):

private static void Main(string[] args)
{
    string dialogResult = "";
    bool[] alreadyGuessed = new bool[10];
    int guesses = 0;

    Random newNumberGenerator = new Random();
    do
    {
        int number = newNumberGenerator.Next(0, 10);
        if (!alreadyGuessed[number])
        {
            guesses++;
            alreadyGuessed[number] = true;
            Console.WriteLine("Are you thinking of the number " + number.ToString() + "?")
            dialogResult = Console.ReadLine();
        }
    }
    while (dialogResult.ToUpper() != "Y" && guesses < 10);

    if (dialogResult.ToUpper() == "Y")
    {
        Console.WriteLine("I guessed the number!");
    }
    else
    {
        Console.WriteLine("No numbers left!");
    }
    Console.ReadLine();
}

原始程序中的逻辑似乎有些倒退;目前尚不清楚是用户还是计算机在猜测。该程序假设您正在考虑0到9之间的数字(包括)并让计算机尝试猜测它,但您显然可以根据您的需要进行调整。我也省略了任何验证逻辑。

编辑:正如Tarec正确指出的那样,这并没有扩展到非常大的数字集。要做到这一点,你需要一个适当的改组算法,如下所示:

public static void Shuffle(int[] array)
{
    var random = new Random();
    for (int i = array.Length; i > 1; i--)
    {
        int j = random.Next(i);
        int temp = array[j];
        array[j] = array[i - 1];
        array[i - 1] = temp;
    }
}

然后你可以改变你的程序:

private static void Main(string[] args)
{
    string dialogResult = "";
    int size = 10;

    int[] array = Enumerable.Range(0, size).ToArray();
    Shuffle(array);

    for (int i = 0; i < size; i++)
    {
        int number = array[i];
        Console.WriteLine("Are you thinking of the number " + number.ToString() + "?");
        dialogResult = Console.ReadLine();
        if (dialogResult.ToUpper() == "Y")
        {
            break;
        }
    }

    if (dialogResult.ToUpper() == "Y")
    {
        Console.WriteLine("I guessed the number!");
    }
    else
    {
        Console.WriteLine("No numbers left!");
    }
    Console.ReadLine();
}

现在您可以将'size'更改为您喜欢的任何内容,程序将正常运行。不过,这对于原始海报的需求来说可能有点过分了。

答案 2 :(得分:0)

我通过添加要选择的数字数组来修改代码。然后我只随机数组的索引。如果数字不正确,则从数组中删除该数字并重新重做。

int guessTheNumber = Convert.ToInt32(txtNumberGuess.Text);
DialogResult dialogResult;
ArrayList numberList = new ArrayList();
for(int i=1; i<10; i++)
   numberList.Add(i);
int length = index.Count;
do
{
   Random newNumberGenerator = new Random();
   index = newNumberGenerator.Next(length);
   dialogResult = MessageBox.Show("Is number" + numberList[index].ToString() + " you are thinking about?", "Answer the question!", MessageBoxButtons.YesNo);
   if( dialogResult == DialogResult.No) 
   {
      numberList.RemoveAt(index);
      length = length - 1;
      if(length == 0)
      {
          MessageBox.Show("No number left!!");  
          return;
      }
   }
}while (dialogResult == DialogResult.No);
MessageBox.Show("Congratulation! You guessed the number!!");