程序猜测数字变得非常慢

时间:2018-04-03 12:42:46

标签: c# arrays list random numbers

所以,我决定有一些乐趣,并制作一个会提出一个数字的程序,你必须用它来猜测它是否会过高/太低。但是,如果计算机本身能够提出随机数,我认为会更有趣。

我在这里使用一个简单的方法,基本上有程序检查一个值是否在array中,如果是,则提出另一个随机数。当一个数字太高时,从数字的大小开始,然后下降到那个数字(如果它的数字太高,它就再也不会猜到那么高或更高)。

因此,这适用于小数字。我认为当做一个像1000或者其他什么的数字时,它会在15次尝试中猜到它。然而,当我做了10,000,000(我知道,它有点极端,但我想看到C#的力量,因为我对这种语言很新)。

该计划得到了大约10个猜测并开始放慢速度令人难以置信。我已经安装了一个250毫秒的睡眠计时器,使它看起来更像是猜测(因为它是1000或10,000之类的瞬间),但是当它取出时,它仍然放慢速度。我认为这可能是因为如果它猜测一个像300万的数字,它必须为一个数组添加700万个值(我使用List以便它有一个"无限&#34 ;价值)。

那么我到底能做些什么呢?我希望它能够猜出大数字,但在这一点上它似乎并不可能。我怎么能这样做?

这是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;

namespace Program {
    class Program {
        static void Main(string[] args) {
            Random random = new Random();
            int selectedNumber = random.Next(1, 101);
            int maxNumber;
            int guessNumber = 0;
            int inputNumber = 0;
            // Intro
            Console.ForegroundColor = ConsoleColor.DarkGreen;
            Console.WriteLine("Welcome to the High Low - Computer version program!");
            System.Threading.Thread.Sleep(4000);
            Console.WriteLine("\n--------------------------------------------------------");
            Console.ForegroundColor = ConsoleColor.DarkYellow;
            // This way the computer guesses rather than you
            char who = 'C';
            Console.Write("\nHow high do you want the computer's number to be max > ");
            maxNumber = Convert.ToInt32(Console.ReadLine());
            List<int> guessedNumbers = new List<int>();
            selectedNumber = random.Next(1, maxNumber);
            do {
                // System.Threading.Thread.Sleep(250);
                Console.ForegroundColor = ConsoleColor.DarkYellow;
                if (who == 'M') {
                    Console.Write("\nPlease enter your guess > ");
                    guessNumber = Convert.ToInt32(Console.ReadLine());
                }
                else {
                    while (true) {
                        guessNumber = random.Next(1, maxNumber);
                        if (!(guessedNumbers.Contains(guessNumber))) {
                            guessedNumbers.Add(guessNumber);
                            inputNumber++;
                            break;
                        }
                    }
                    Console.WriteLine("Please enter your guess > {0}", guessNumber);
                }
                Console.ForegroundColor = ConsoleColor.DarkGreen;
                if (guessNumber < selectedNumber) {
                    Console.WriteLine("\nYou're guessing too low!\n");
                    for (int i = 0; i < guessNumber; i++) {
                        guessedNumbers.Add(i);
                        inputNumber++;
                    }
                }
                else if (guessNumber > selectedNumber) {
                    Console.WriteLine("\nYou're guessing too high!\n");
                    for (int i = maxNumber; i > guessNumber; i--) {
                        guessedNumbers.Add(i);
                        inputNumber++;
                    }
                }
            } while (guessNumber != selectedNumber);
            Console.ForegroundColor = ConsoleColor.DarkGreen;
            Console.WriteLine("\nCongratulations! You correctly guessed that {0} is the computer's number!", selectedNumber);
            Console.ReadKey();
        }
    }
}

编辑:我想我会尝试一种方法来制作它,以便它只添加更高或更低的数字(如果它们还没有在那里),以保持来自重复的数字。

3 个答案:

答案 0 :(得分:0)

for (int i = 0; i < guessNumber; i++) 
{
    guessedNumbers.Add(i);
    inputNumber++;
}

每当您输入这些类型的循环时,您都会添加&#39; guessnumber&#39;列表中的项目,可能是数百万。

考虑重新阅读您的代码并了解它的作用。

此外,您应该考虑封装代码,以避免成为main()

的庞然大物

答案 1 :(得分:0)

另一种方法是使用Binary Search方法猜测数字并避免因编写和搜索猜测值而导致的额外开销。

这应该在O(log n).

中运行
int minGuess = 0;
int maxGuess = 1000000;

Random random = new Random();
int selectedNumber = random.Next(minGuess, maxGuess);

Console.WriteLine($"Selected number: {selectedNumber}");

int guess;

int count = 0;

do
{
    count++;

    guess = (minGuess + maxGuess) / 2;

    Console.WriteLine($"Guess: {guess}");

    if (selectedNumber < guess)
        maxGuess = guess - 1;
    else
        minGuess = guess + 1;

} while (guess != selectedNumber);

Console.WriteLine($"Guessed it in {count} tries");
Console.ReadLine();

答案 2 :(得分:0)

您尝试使用计算机的电源查找号码的方式并不是很有效,为什么不根据先前猜测的数字是高于还是低于该值来更改可能的猜测数字的范围如此正确的数字:

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Highest number:");
            int maxNumber = Convert.ToInt32(Console.ReadLine());
            Random rand = new Random();
            int correctNumber = rand.Next(0, maxNumber);

            Console.WriteLine("Trying to guess number now..");
            int guessedNumber = 0;

            int lowBound = 0;
            int highBound = maxNumber;
            int guesses = 0;
            while(guessedNumber != correctNumber)
            {
                guessedNumber = rand.Next(lowBound, highBound);
                if(guessedNumber > correctNumber)
                {
                    highBound /= 2;
                    lowBound /= 2;
                }
                else if(guessedNumber < correctNumber)
                {
                    lowBound *= 2;
                    highBound *= 2;
                }
                ++guesses;
            }
            Console.WriteLine($"Took me {guesses} guesses.");
            Console.ReadKey();
        }
    }

我的机器上的10,000,000个条目只需不到一秒钟。