从列表中选择一个随机的随机.如果不是所选的,请选择另一个
本文关键字:随机 如果不 另一个 请选择 一个 选择 列表 | 更新日期: 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!!");