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

本文关键字:随机 如果不 另一个 请选择 一个 选择 列表 | 更新日期: 2023-09-27 17:55:58

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

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!!");       
}

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

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

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

现在,您可以将"大小"更改为您喜欢的任何大小,程序将正常工作。不过,这对于原始海报的需求来说可能是矫枉过正了。

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

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

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!!");