Mohit Tomar Ответов: 1

Как сгенерировать случайное число только один раз в C#


Прежде всего, я хотел бы поблагодарить Code Project за помощь в моем стремлении изучить C#. Я начал учиться этой программе как хобби и выбрал c#, так как слышал, что его довольно легко выучить человеку без какого-либо опыта программирования. Однако я понял, что это все еще слишком тяжело для меня. Но код проекта всегда помогала мне выяснить, что происходит. В любом случае...

Поэтому я пытался написать консольное приложение на C# , которое отображает анимацию на консоли. До сих пор я могу написать около 95% кода, и он работает, но я все еще не могу понять, как сгенерировать случайное число из списка чисел только один раз. Я включил код, который я написал для всех, чтобы просмотреть. Прямо сейчас я должен использовать избыточный метод, чтобы убедиться, что все символы напечатаны на консоли. Что отнимает уйму времени и, наверное, памяти тоже. Ниже приведен мой код. Пожалуйста, извините меня, если код кажется трудным для чтения, так как прошло всего около 1,5 месяцев с тех пор, как я начал работать с c#.

Если кто-нибудь может подсказать мне, что я могу сделать, чтобы удалить избыточный номер итерации из моего кода, то я думаю, что он будет завершен.

<pre>
using System;
using System.IO;
using System.Threading;

namespace BeautifulNameAnimation
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Please play in maximised window mode. PRESS ENTER after maximising your window");
            Console.ReadKey();
            Console.WriteLine("Please enter the complete path of your text file including the text file name with extension: ");
            Console.ForegroundColor = ConsoleColor.Magenta;
            Console.Write(">>> ");
            Console.ResetColor();
            string path = Console.ReadLine();
            Console.WriteLine("Provide animation delay number. Bigger the number Slower the animation.");
            Console.ForegroundColor = ConsoleColor.Magenta;
            Console.Write(">>> ");
            Console.ResetColor();
            int animDelay = int.Parse(Console.ReadLine());
            Console.WriteLine("Redundancy Number: (This number decides the iteration for animation) -- Start with 1000 and then gradually increase it. ");
            Console.ForegroundColor = ConsoleColor.Magenta;
            Console.Write(">>> ");
            Console.ResetColor();
            int redundencyCounter = int.Parse(Console.ReadLine());
            Console.Clear();

            //// Program Execution Stage -1
            int[] Method1Output = ReturnColsAndRows(path);
            //// Program Execution Stage -2
            char[,] Method2Output = ExtractAllChars(Method1Output, path);
            //// Program Execution Stage -3 (Final OutPut)
            PrintTextFile(Method2Output, animDelay, redundencyCounter);
            Console.ResetColor();
            Console.ReadKey();
        }
        //Method No. 1
        #region Method for calculating Rows and Colums in the Source Text File.
        public static int[] ReturnColsAndRows(string path)
        {
            StreamReader reader = new StreamReader(path);
            int cols = reader.ReadLine().Length;
            int rows = 1;
            string line = reader.ReadLine();
            while (line != null)
            {
                rows++;
                line = reader.ReadLine();
            }
            reader.Close();
            int[] rowsNcols = new int[2] { rows, cols }; //To be used in Method No. 2 for Char[,]
            return rowsNcols;
        }
        #endregion
        //Method No. 2
        #region Method for extracting individual characters from Source Text File.
        public static char[,] ExtractAllChars(int[] Method1Output, string path)
        {
            StreamReader reader = new StreamReader(path);
            string line = reader.ReadLine();
            char[,] charsInSourceFile = new char[Method1Output[0], Method1Output[1]];
            for (int row = 0; row < charsInSourceFile.GetLength(0); row++)
            {
                for (int col = 0; col < charsInSourceFile.GetLength(1); col++)
                {
                    charsInSourceFile[row, col] = line[col];
                }
                line = reader.ReadLine();
            }
            reader.Close();
            return charsInSourceFile;
        }
        #endregion
        //Method No. 3
        #region Method for printing extracted chars in a random fashion
        public static void PrintTextFile(char[,] charsInSourceFile, int animDelay, int redundencyCounter)
        {
            int counter = 0;
            Random rand = new Random();
            while (true)
            {
                int row = rand.Next(charsInSourceFile.GetLength(0));
                int col = rand.Next(charsInSourceFile.GetLength(1));
                Console.SetCursorPosition(col, row);
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.Write(charsInSourceFile[row, col]);
                counter++;
                Thread.Sleep(animDelay);
                if (counter == redundencyCounter) // This is the problem
                {
                    Console.SetCursorPosition(0, charsInSourceFile.GetLength(0) + 2);
                    break;
                }
            }
        }
        #endregion
    }
}



Что я уже пробовал:

Я попытался погуглить свой вопрос, но не смог найти никакого решения

BillWoodruff

Ваш код предполагает, что все строки в файле имеют одинаковую длину: это то, что вы действительно хотите ?

Если все линии имеют одинаковую длину и вы используете один и тот же файл каждый раз, то вы можете сгенерировать случайные точки и символы один раз и перетасовать их, если хотите, чтобы анимация каждый раз была разной.

1 Ответов

Рейтинг:
2

Patrice T

Цитата:
Я до сих пор не могу понять, как сгенерировать случайное число из списка чисел только один раз.

"Только один раз" делает ваше число не случайным, потому что случайное подразумевает возможность повторения.
Вы ищете "перетасовать", так же, как с игральными картами.
Перетасовка на компьютере:
сделайте массив размером 52 и сохраните каждую карту в массиве. Карты находятся на позициях от 0 до 51.
Нарисуйте число от 0 до 51, замените эту карту на 1 в позиции 0.
Нарисуйте число от 1 до 51, замените эту карту на 1 в позиции 1.
Нарисуйте число между 2 и 51, замените эту карту на 1 в позиции 2.
Нарисуйте число от 3 до 51, замените эту карту на 1 в позиции 3.
и так до тех пор, пока не останется только последняя карта.
Затем вы читаете массив по порядку, как вам нужно, вы не будете рисовать одну и ту же карту 2 раза до конца массива.


BillWoodruff

Мой голос за № 3. Я не думаю, что вы ясно понимаете, что здесь делает ОП.

"Только один раз" делает ваше число не случайным, потому что случайное подразумевает возможность повторения."

Последовательность чисел, выбранных случайным образом без дублирования, не делает их "неслучайными". конечно, в зависимости от количества генерируемых чисел набор чисел может иметь более или менее "случайный порядок"."

Patrice T

Привет Билл,
а 3-это совершенно нормально для меня.
Я согласен, что могу ошибаться в вопросе, но ОП не комментировал, и никто другой не дал ответа, только ваш комментарий.

BillWoodruff

Для меня голосование № 3 не является голосованием против, и я рад, что вам это удобно.

Я собирался опубликовать какой-нибудь, возможно, полезный код, но сделаю это только в том случае, если ОП ответит на мой запрос.

твое здоровье, Билл

Patrice T

Привет Билл,
а #3-это тоже не даунвот для меня, он не удаляет точки повторения.