- Windows forms случайное число
- Генерация случайных чисел в C#
- Добавить комментарий Отменить ответ
- Генератор случайных чисел
- Заполнить textBox случайными числами
- Решение
- Решение
- Программирование на C, C# и Java
- Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы
- Случайные числа в C#. Функция Random
- Random Класс
- Определение
- Примеры
- Комментарии
- Создание экземпляра генератора случайных чисел Instantiating the random number generator
- Предотвращение нескольких экземпляров Avoiding multiple instantiations
- Класс System. Random и безопасность потоков The System.Random class and thread safety
- Создание различных типов случайных чисел Generating different types of random numbers
- Замена собственного алгоритма Substituting your own algorithm
- Как использовать System. Random to. How do you use System.Random to…
- Получение той же последовательности случайных значений Retrieve the same sequence of random values
- Получение уникальных последовательностей случайных чисел Retrieve unique sequences of random numbers
- Получение целых чисел в указанном диапазоне Retrieve integers in a specified range
- Получение целых чисел с указанным числом цифр Retrieve integers with a specified number of digits
- Получение значений с плавающей запятой в указанном диапазоне Retrieve floating-point values in a specified range
- Создание случайных логических значений Generate random Boolean values
- Создавать случайные 64-разрядные целые числа Generate random 64-bit integers
- Извлечение байтов в указанном диапазоне Retrieve bytes in a specified range
- Извлечение элемента из массива или коллекции в случайном порядке Retrieve an element from an array or collection at random
- Извлечение уникального элемента из массива или коллекции Retrieve a unique element from an array or collection
- Примечания для тех, кто наследует этот метод
- Примечания для тех, кто вызывает этот метод
- Конструкторы
- Методы
Windows forms случайное число
Генерация случайных чисел в C#
Доброго времени суток! Эта статья носит практический характер и в ней я расскажу о том, как использовать генератор случайных чисел в C# и для чего это Вам может пригодиться. Хотя, если на чистоту, то речь пойдет о генераторе псевдослучайных чисел…
Где нам могут понадобиться случайные числа, да на самом деле можно привести в пример много случаев, например, криптография, или механизмы разрешения различных коллизий. Поверьте, рано или поздно Вам с такой необходимостью придется столкнуться, если уже не пришлось, раз читаете эту статью. К счастью, в C# генератор случайных чисел разработан до нас, и единственное что нам нужно будет, большинстве случаев, это просто правильно им пользоваться. И так, для генерации случайных чисел в программах, написанных на C#, предназначен класс «Random».
Как видите — ничего сложного! Сначала создаем объект типа «Random», потом вызываем его метод «Next», в результате чего и получаем случайное число. Если мы вызовем метод «Next» несколько раз, то получим разные числа. Такой код, даст нам четыре разных, случайных числа:
А теперь, давайте слегка усложним задачу, представим, что нам нужно получить случайное число в определенном диапазоне. Но и эта задача выполняется довольно просто:
Как видите, и это выполняется несложно! Для этого мы всего лишь вызвали метод «Next» с двумя параметрами, первый из которых обозначает нижнюю границу диапазона, а второй — верхнюю.
Кстати, ограничить можно только верхнюю границу диапазона, для этого нужно вызвать метод «Next» с одним параметром, который и будет обозначать верхнюю границу.
Но это ещё не всё, есть еще один важный нюанс, на самом деле генератор случайных чисел является генератором псевдослучайных чисел, т.е. числа, которые он возвращает, не являются чисто случайными, они «вырабатываются» по определенным и четким законам, а «случайность» зависит от инициализации объекта, который генерирует числа (объекта класса «Random»). В примерах, приведенных выше, мы использовали конструктор по умолчанию, и в таком случае (судя по всему), «начальное значение» задается системой, и на основании системного времени. Но мы может задавать это самое «начальное значение» и сами:
Только обратите внимание, начальное значение используется для генерации чисел, а не для возвращения первого числа, т.е. первое сгенерированное число не будет тем, что указано при создании объекта.
Так вот если два (или более) разных объекта класса «Random» будут одинаково проинициализированы, то и возвращать они будут одни и те же числа, например, следующий код, выведет в консоль три одинаковых числа:
Как видите, не смотря на то, что в при каждом вызове метода «GetRandom» создается новый объект для генерации случайных чисел, инициализируются эти объекты одним и тем же значением. Так что, будьте внимательны!
Добавить комментарий Отменить ответ
Для отправки комментария вам необходимо авторизоваться.
Генератор случайных чисел
Генератор случайных чисел
Хочу чтобы при нажатии на кнопку , либо при запуске программы заполнились 3шт textbox рандомными.
Генератор случайных чисел
Помогите пожалуйста, нужно написать программу-генератор случайных чисел для Windows Forms на C#.
Генератор случайных чисел из диапазона с шагом
Надо написать функцию, которая будет брать min и max с numericUpDown элементов с главной формы и.
Формирование одномерного массива, генератор случайных чисел
Описать функции формирования элементов одномерного массива с помощью генератора случайных чисел и.
В C# есть специальный класс, генерирующий случайные числа. «System.Random». Как это делается:
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.
Рисование фигур, используя генератор случайных чисел
как с помощью генератора случайных чисел рисовать простые фигуры( окружности,квадраты и т.д)?
Генератор строго случайных чисел
Требуется сабж. Стандартная функция рандома не канает, даже с заданным параметром (время в мс к.
Генератор чисел
Для генерации числа использую такой алгоритм: Random rand = new Random(); .
генератор уникальных чисел
такой вопрос: будет ли это считаться уникальным кодом public static string Number(string str) .
Заполнить textBox случайными числами
Заполнить DataGridView случайными десятичными числами
Заполнить DataGridView случайными десятичными числами в диапазоне . Количество строк и столбцов.
Нажатием на кнопку заполнить массив случайными числами
Подскажите, пожалуйста, как нажатием на кнопку заполнить одномерный массив случайными числами. .
Заполнить матрицу случайными числами без повторений и совпадений
Помогите переписать код с массива на матрицу, массив отлично заполняется случайными числами от 1 до.
Сформировать матрицу с заданным количеством строк и столбцов и заполнить ее случайными числами в диапазоне от
Сформировать матрицу с заданным количеством строк и столбцов и заполнить ее случайными числами в.
Решение
Можно вполне обойтись ОДНИМ текстбоксом при условии, что введенные числа будут разделены ОДНИМ пробелом.
Для примера, выводится сумма чисел строки.
Данные в текстбокс я ввел вручную, можно и в цикле
Вложения
Прототип.rar (51.0 Кб, 7 просмотров) |
Решение
bbq, помоги вот с этим пожалуйста
using Word = Microsoft.Office.Interop.Word;
using Microsoft.Office.Interop.Word;
private void button1_Click(object sender, EventArgs e)
<
Word.Application oWord = new Word.Application();
Word.Application app = new Word.Application();
_Document oDoc = oWord.Documents.Add(@»C:\Users\443\Documents\Работа\Реферат. docx»);
SetTemplate(oDoc);
oDoc.SaveAs(FileName@»C:\Users\443\Documents\Работа\Рефера т.docx»));
oWord.Quit();
private void SetTemplate(_Document oDoc)
<
Программирование на C, C# и Java
Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы
ОСТОРОЖНО МОШЕННИКИ! В последнее время в социальных сетях участились случаи предложения помощи в написании программ от лиц, прикрывающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в посторонних группах ВК. Для связи с нами используйте исключительно эти контакты: vscoderu@yandex.ru, https://vk.com/vscode
Случайные числа в C#. Функция Random
Рассмотрим код программы, генерирующей случайные числа в C# при помощи функции random.
Для начала нам надо объявить экземпляр класса генерации рандомных чисел:
rand – имя этого экземпляра.
Мы хотим, чтобы пользователь сам вводил количество нужных ему чисел, поэтому пишем следующее:
В первой строке мы выводит в консоли сообщение, во второй считываем строковое стринговское значение, которое введёт нам пользователь, а в третьей конвертируем полученные нами данные из формата строки в формат целочисленного числа.
Затем создаём цикл for:
Мы вводим новую переменную i, равную нулю и задаём условие – пока i меньше, чем a – число, введённое пользователем, будет выполняться код внутри фигурных скобок. А после каждого выполнения условия к i будет прибавляться единица.
Внутри скобок же у нас выполняется код, который выводит в консоль рандомные числа.
Число 100 в скобках означает, что числа будут генерироваться в пределах от о до 100.
Например, если переделать этот кусочек кода так, как написано ниже, то числа будут генерироваться с пределах от 50 до 1000 и т.д.
Random Класс
Определение
Представляет генератор псевдослучайных чисел, то есть алгоритм, который генерирует последовательность чисел, отвечающую определенным статистическим критериям случайности. Represents a pseudo-random number generator, which is an algorithm that produces a sequence of numbers that meet certain statistical requirements for randomness.
Примеры
В следующем примере создается один генератор случайных чисел и вызывается его NextBytes Next методы, и NextDouble для создания последовательностей случайных чисел в разных диапазонах. The following example creates a single random number generator and calls its NextBytes, Next, and NextDouble methods to generate sequences of random numbers within different ranges.
В следующем примере создается случайное целое число, которое используется в качестве индекса для получения строкового значения из массива. The following example generates a random integer that it uses as an index to retrieve a string value from an array.
Комментарии
Псевдо-случайные числа выбираются с равной вероятностью из конечного набора чисел. Pseudo-random numbers are chosen with equal probability from a finite set of numbers. Выбранные числа не являются полностью случайными, поскольку для их выбора используется математический алгоритм, но они достаточно случайные для практических целей. The chosen numbers are not completely random because a mathematical algorithm is used to select them, but they are sufficiently random for practical purposes. Текущая реализация Random класса основана на измененной версии алгоритма генератора случайных чисел Дональд E. кнута с вычитанием. The current implementation of the Random class is based on a modified version of Donald E. Knuth’s subtractive random number generator algorithm. Дополнительные сведения см. в разделе D. E. For more information, see D. E. Кнута. Knuth. Искусство компьютерной программирования, том 2: алгоритмы семинумерикал. The Art of Computer Programming, Volume 2: Seminumerical Algorithms. Addison-Wesley, чтение, MA, третий выпуск, 1997. Addison-Wesley, Reading, MA, third edition, 1997.
Чтобы создать криптографически защищенное случайное число, например подходящее для создания случайного пароля, используйте RNGCryptoServiceProvider класс или наследует класс от System.Security.Cryptography.RandomNumberGenerator . To generate a cryptographically secure random number, such as one that’s suitable for creating a random password, use the RNGCryptoServiceProvider class or derive a class from System.Security.Cryptography.RandomNumberGenerator.
В этом разделе: In this topic:
Создание экземпляра генератора случайных чисел Instantiating the random number generator
Чтобы создать экземпляр генератора случайных чисел, укажите начальное значение (начальное значение для алгоритма формирования псевдо-случайных чисел) Random конструктору класса. You instantiate the random number generator by providing a seed value (a starting value for the pseudo-random number generation algorithm) to a Random class constructor. Начальное значение можно указать явно или неявно: You can supply the seed value either explicitly or implicitly:
Random(Int32)Конструктор использует явно указываемое начальное значение. The Random(Int32) constructor uses an explicit seed value that you supply.
Random()Конструктор использует начальное значение по умолчанию. The Random() constructor uses the default seed value. Это наиболее распространенный способ создания экземпляра генератора случайных чисел. This is the most common way of instantiating the random number generator.
В платформа .NET Framework начальное значение по умолчанию зависит от времени. In .NET Framework, the default seed value is time-dependent. В .NET Core значение начального значения по умолчанию создается статическим генератором случайных чисел потока. In .NET Core, the default seed value is produced by the thread-static, pseudo-random number generator.
Если для отдельных объектов используется одно и то же начальное значение Random , они будут создавать одинаковые ряды случайных чисел. If the same seed is used for separate Random objects, they will generate the same series of random numbers. Это может быть полезно для создания набора тестов, который обрабатывает случайные значения или для воспроизведения игр, которые наследуют данные от случайных чисел. This can be useful for creating a test suite that processes random values, or for replaying games that derive their data from random numbers. Однако обратите внимание, что Random объекты в процессах, выполняющихся в разных версиях платформа .NET Framework, могут возвращать разные серии случайных чисел, даже если они создаются с одинаковыми начальными значениями. However, note that Random objects in processes running under different versions of the .NET Framework may return different series of random numbers even if they’re instantiated with identical seed values.
Для создания различных последовательностей случайных чисел можно сделать начальное значение зависимым от времени, тем самым создавая другой ряд с каждым новым экземпляром Random . To produce different sequences of random numbers, you can make the seed value time-dependent, thereby producing a different series with each new instance of Random. Параметризованный Random(Int32) конструктор может принимать значение на Int32 основе числа тактов в текущем времени, тогда как конструктор без параметров Random() использует системные часы для создания начального значения. The parameterized Random(Int32) constructor can take an Int32 value based on the number of ticks in the current time, whereas the parameterless Random() constructor uses the system clock to generate its seed value. Однако только на платформа .NET Framework, поскольку часы имеют конечное разрешение, использование конструктора без параметров для создания различных Random объектов в закрытой последовательности создает генераторы случайных чисел, которые создают идентичные последовательности случайных чисел. However, on the .NET Framework only, because the clock has finite resolution, using the parameterless constructor to create different Random objects in close succession creates random number generators that produce identical sequences of random numbers. В следующем примере показано, как два Random объекта, создаваемые в приложении платформа .NET Framework, создают идентичные последовательности случайных чисел. The following example illustrates how two Random objects that are instantiated in close succession in a .NET Framework application generate an identical series of random numbers. В большинстве систем Windows Random объекты, созданные в течение 15 миллисекунд, могут иметь одинаковые начальные значения. On most Windows systems, Random objects created within 15 milliseconds of one another are likely to have identical seed values.
Чтобы избежать этой проблемы, создайте один Random объект, а не несколько объектов. To avoid this problem, create a single Random object instead of multiple objects. Обратите внимание, что Random класс в .NET Core не имеет этого ограничения. Note that the Random class in .NET Core does not have this limitation.
Предотвращение нескольких экземпляров Avoiding multiple instantiations
На платформа .NET Framework инициализация двух генераторов случайных чисел в тесном цикле или при быстром выполнении создает два генератора случайных чисел, которые могут формировать идентичные последовательности случайных чисел. On the .NET Framework, initializing two random number generators in a tight loop or in rapid succession creates two random number generators that can produce identical sequences of random numbers. В большинстве случаев это не является намерением разработчика и может привести к проблемам с производительностью, поскольку создание и инициализация генератора случайных чисел является сравнительно дорогостоящим процессом. In most cases, this is not the developer’s intent and can lead to performance issues, because instantiating and initializing a random number generator is a relatively expensive process.
Чтобы повысить производительность и избежать случайного создания отдельных генераторов случайных чисел, создающих идентичные числовые последовательности, рекомендуется создать один Random объект для создания большого числа случайных чисел с течением времени, вместо того чтобы создавать новые Random объекты для создания одного случайного числа. Both to improve performance and to avoid inadvertently creating separate random number generators that generate identical numeric sequences, we recommend that you create one Random object to generate many random numbers over time, instead of creating new Random objects to generate one random number.
Однако Random класс не является потокобезопасным. However, the Random class isn’t thread safe. При вызове Random методов из нескольких потоков следуйте рекомендациям, изложенным в следующем разделе. If you call Random methods from multiple threads, follow the guidelines discussed in the next section.
Класс System. Random и безопасность потоков The System.Random class and thread safety
Вместо создания экземпляров отдельных Random объектов рекомендуется создать один Random экземпляр для создания всех случайных чисел, необходимых для приложения. Instead of instantiating individual Random objects, we recommend that you create a single Random instance to generate all the random numbers needed by your app. Однако Random объекты не являются потокобезопасными. However, Random objects are not thread safe. Если приложение вызывает Random методы из нескольких потоков, необходимо использовать объект синхронизации, чтобы убедиться, что только один поток может одновременно получить доступ к генератору случайных чисел. If your app calls Random methods from multiple threads, you must use a synchronization object to ensure that only one thread can access the random number generator at a time. Если не гарантировать, что Random доступ к объекту осуществляется потокобезопасным способом, вызовы методов, возвращающих случайные числа, возвращают 0. If you don’t ensure that the Random object is accessed in a thread-safe way, calls to methods that return random numbers return 0.
В следующем примере используется оператор блокировки C# и оператор Visual Basic SyncLock , чтобы гарантировать, что один генератор случайных чисел обращается к 11 потокам потокобезопасным образом. The following example uses the C# lock Statement and the Visual Basic SyncLock statement to ensure that a single random number generator is accessed by 11 threads in a thread-safe manner. Каждый поток создает 2 000 000 случайных чисел, подсчитывает количество создаваемых случайных чисел и вычисляет их сумму, а затем обновляет итоги для всех потоков после завершения выполнения. Each thread generates 2 million random numbers, counts the number of random numbers generated and calculates their sum, and then updates the totals for all threads when it finishes executing.
В примере безопасность потоков обеспечивается следующими способами. The example ensures thread-safety in the following ways:
ThreadStaticAttributeАтрибут используется для определения локальных переменных потока, которые отправляют общее число формируемых случайных чисел и их сумму для каждого потока. The ThreadStaticAttribute attribute is used to define thread-local variables that track the total number of random numbers generated and their sum for each thread.
Блокировка ( lock оператор в C# и SyncLock оператор в Visual Basic) обеспечивает защиту доступа к переменным для общего количества и суммирования всех случайных чисел, созданных во всех потоках. A lock (the lock statement in C# and the SyncLock statement in Visual Basic) protects access to the variables for the total count and sum of all random numbers generated on all threads.
Семафор ( CountdownEvent объект) используется, чтобы обеспечить блокировку основного потока до завершения выполнения всех остальных потоков. A semaphore (the CountdownEvent object) is used to ensure that the main thread blocks until all other threads complete execution.
В примере проверяется, поврежден ли генератор случайных чисел, путем определения, будут ли два последовательных вызова методов генерации случайных чисел возвращать 0. The example checks whether the random number generator has become corrupted by determining whether two consecutive calls to random number generation methods return 0. Если обнаружено повреждение, в примере используется CancellationTokenSource объект для сигнализации о том, что все потоки должны быть отменены. If corruption is detected, the example uses the CancellationTokenSource object to signal that all threads should be canceled.
Перед созданием каждого случайного числа каждый поток проверяет состояние CancellationToken объекта. Before generating each random number, each thread checks the state of the CancellationToken object. При запросе отмены в примере вызывается CancellationToken.ThrowIfCancellationRequested метод для отмены потока. If cancellation is requested, the example calls the CancellationToken.ThrowIfCancellationRequested method to cancel the thread.
Следующий пример идентичен первому, за исключением того, что он использует Task объект и лямбда-выражение вместо Thread объектов. The following example is identical to the first, except that it uses a Task object and a lambda expression instead of Thread objects.
Он отличается от первого примера следующими способами. It differs from the first example in the following ways:
Переменные, которые следует отследить от количества формируемых случайных чисел и их сумму в каждой задаче, являются локальными для задачи, поэтому нет необходимости использовать ThreadStaticAttribute атрибут. The variables to keep track of the number of random numbers generated and their sum in each task are local to the task, so there is no need to use the ThreadStaticAttribute attribute.
Статический Task.WaitAll метод используется, чтобы гарантировать, что главный поток не завершится до завершения всех задач. The static Task.WaitAll method is used to ensure that the main thread doesn’t complete before all tasks have finished. Объект не требуется CountdownEvent . There is no need for the CountdownEvent object.
Исключение, полученное в результате отмены задачи, отображается в Task.WaitAll методе. The exception that results from task cancellation is surfaced in the Task.WaitAll method. В предыдущем примере он обрабатывается каждым потоком. In the previous example, it is handled by each thread.
Создание различных типов случайных чисел Generating different types of random numbers
Генератор случайных чисел предоставляет методы, позволяющие создавать следующие виды случайных чисел: The random number generator provides methods that let you generate the following kinds of random numbers:
Ряд Byte значений. A series of Byte values. Вы определяете количество байтовых значений, передавая массив, инициализируемый в число элементов, которые метод должен вернуть в NextBytes метод. You determine the number of byte values by passing an array initialized to the number of elements you want the method to return to the NextBytes method. Следующий пример приводит к возникновению 20 байтов. The following example generates 20 bytes.
Одно целое число. A single integer. Можно выбрать, требуется ли целое число от 0 до максимального значения ( Int32.MaxValue -1), вызвав метод Next() , целое число от 0 до определенного значения путем вызова метода Next(Int32) или целого числа в диапазоне значений, вызвав Next(Int32, Int32) метод. You can choose whether you want an integer from 0 to a maximum value (Int32.MaxValue — 1) by calling the Next() method, an integer between 0 and a specific value by calling the Next(Int32) method, or an integer within a range of values by calling the Next(Int32, Int32) method. В параметризованных перегрузках указанное максимальное значение является эксклюзивным; то есть фактическое максимальное число, созданное на единицу, меньше указанного значения. In the parameterized overloads, the specified maximum value is exclusive; that is, the actual maximum number generated is one less than the specified value.
В следующем примере вызывается Next(Int32, Int32) метод для создания 10 случайных чисел в диапазоне от-10 до 10. The following example calls the Next(Int32, Int32) method to generate 10 random numbers between -10 and 10. Обратите внимание, что второй аргумент метода указывает эксклюзивную верхнюю границу диапазона случайных значений, возвращаемых методом. Note that the second argument to the method specifies the exclusive upper bound of the range of random values returned by the method. Иными словами, самое большое целое число, которое метод может вернуть, меньше этого значения. In other words, the largest integer that the method can return is one less than this value.
Одиночное значение с плавающей запятой от 0,0 до меньше 1,0 путем вызова NextDouble метода. A single floating-point value from 0.0 to less than 1.0 by calling the NextDouble method. Эксклюзивная верхняя граница случайного числа, возвращаемого методом, — 1, поэтому фактическая верхняя граница — 0.99999999999999978. The exclusive upper bound of the random number returned by the method is 1, so its actual upper bound is 0.99999999999999978. В следующем примере создаются 10 случайных чисел с плавающей запятой. The following example generates 10 random floating-point numbers.
Next(Int32, Int32)Метод позволяет указать диапазон возвращаемого случайного числа. The Next(Int32, Int32) method allows you to specify the range of the returned random number. Однако maxValue параметр, который указывает верхний возвращенный диапазон, является эксклюзивным, а не инклюзивным значением. However, the maxValue parameter, which specifies the upper range returned number, is an exclusive, not an inclusive, value. Это означает, что вызов метода Next(0, 100) возвращает значение от 0 до 99, а не между 0 и 100. This means that the method call Next(0, 100) returns a value between 0 and 99, and not between 0 and 100.
Замена собственного алгоритма Substituting your own algorithm
Вы можете реализовать собственный генератор случайных чисел, наследуя от Random класса и указав алгоритм создания случайных чисел. You can implement your own random number generator by inheriting from the Random class and supplying your random number generation algorithm. Чтобы указать собственный алгоритм, необходимо переопределить Sample метод, который реализует алгоритм создания случайных чисел. To supply your own algorithm, you must override the Sample method, which implements the random number generation algorithm. Также следует переопределить Next() Next(Int32, Int32) методы, и, NextBytes чтобы убедиться, что они вызывают переопределенный Sample метод. You should also override the Next(), Next(Int32, Int32), and NextBytes methods to ensure that they call your overridden Sample method. Вам не нужно переопределять Next(Int32) методы и NextDouble . You don’t have to override the Next(Int32) and NextDouble methods.
Пример, который является производным от Random класса и изменяет генератор случайных чисел псевдослучайных значений по умолчанию, см. на Sample странице справки. For an example that derives from the Random class and modifies its default pseudo-random number generator, see the Sample reference page.
Как использовать System. Random to. How do you use System.Random to…
В следующих разделах приводятся примеры кода для некоторых способов использования случайных чисел в приложении. The following sections discuss and provide sample code for some of the ways you might want to use random numbers in your app.
Получение той же последовательности случайных значений Retrieve the same sequence of random values
Иногда требуется создать одну и ту же последовательность случайных чисел в сценариях тестирования программного обеспечения и в игре. Sometimes you want to generate the same sequence of random numbers in software test scenarios and in game playing. Проверка с одинаковой последовательностью случайных чисел позволяет обнаруживать регрессию и подтверждать исправления ошибок. Testing with the same sequence of random numbers allows you to detect regressions and confirm bug fixes. Использование одинаковой последовательности случайных чисел в играх позволяет воспроизводить предыдущие игры. Using the same sequence of random number in games allows you to replay previous games.
Вы можете создать одну и ту же последовательность случайных чисел, предоставив конструктору одно и то же начальное значение Random(Int32) . You can generate the same sequence of random numbers by providing the same seed value to the Random(Int32) constructor. Начальное значение предоставляет начальное значение для алгоритма формирования псевдослучайных чисел. The seed value provides a starting value for the pseudo-random number generation algorithm. В следующем примере используется 100100 в качестве произвольного начального значения для создания экземпляра Random объекта, выводится 20 случайных значений с плавающей запятой и сохраняется начальное значение. The following example uses 100100 as an arbitrary seed value to instantiate the Random object, displays 20 random floating-point values, and persists the seed value. Затем оно восстанавливает начальное значение, создает новый генератор случайных чисел и отображает те же 20 случайных значений с плавающей точкой. It then restores the seed value, instantiates a new random number generator, and displays the same 20 random floating-point values. Обратите внимание, что в примере могут формироваться различные последовательности случайных чисел, если они работают в разных версиях платформа .NET Framework. Note that the example may produce different sequences of random numbers if run on different versions of the .NET Framework.
Получение уникальных последовательностей случайных чисел Retrieve unique sequences of random numbers
Предоставление различных начальных значений экземплярам Random класса приводит к тому, что каждый генератор случайных чисел создает другую последовательность значений. Providing different seed values to instances of the Random class causes each random number generator to produce a different sequence of values. Начальное значение можно указать явным образом путем вызова Random(Int32) конструктора или неявно путем вызова Random() конструктора. You can provide a seed value either explicitly by calling the Random(Int32) constructor, or implicitly by calling the Random() constructor. Большинство разработчиков вызывают конструктор без параметров, который использует системные часы. Most developers call the parameterless constructor, which uses the system clock. В следующем примере используется этот подход для создания экземпляров двух Random экземпляров. The following example uses this approach to instantiate two Random instances. Каждый экземпляр отображает последовательность из 10 случайных целых чисел. Each instance displays a series of 10 random integers.
Однако из-за его конечного разрешения системные часы не обнаруживают разницы во времени, которые менее 15 миллисекунд. However, because of its finite resolution, the system clock doesn’t detect time differences that are less than approximately 15 milliseconds. Таким образом, если код вызывает Random() перегрузку в платформа .NET Framework для одновременного создания экземпляров двух Random объектов, вы можете случайно предоставить объекты с одинаковыми начальными значениями. Therefore, if your code calls the Random() overload on the .NET Framework to instantiate two Random objects in succession, you might inadvertently be providing the objects with identical seed values. ( Random Класс в .NET Core не имеет этого ограничения.) Чтобы увидеть это в предыдущем примере, закомментируйте Thread.Sleep вызов метода, а затем скомпилируйте и запустите пример еще раз. (The Random class in .NET Core does not have this limitation.) To see this in the previous example, comment out the Thread.Sleep method call, and compile and run the example again.
Чтобы предотвратить это, рекомендуется создать экземпляр одного Random объекта, а не несколько. To prevent this from happening, we recommend that you instantiate a single Random object rather than multiple ones. Однако, поскольку Random не является потокобезопасным, необходимо использовать некоторое устройство синхронизации при доступе к Random экземпляру из нескольких потоков. Дополнительные сведения см. в разделе случайный класс и безопасность потоков ранее в этой статье. However, since Random isn’t thread safe, you must use some synchronization device if you access a Random instance from multiple threads; for more information, see The Random class and thread safety earlier in this topic. Кроме того, можно использовать механизм задержки, например Sleep метод, используемый в предыдущем примере, чтобы убедиться в том, что создание экземпляров происходит более чем на 15 миллисекунд. Alternately, you can use a delay mechanism, such as the Sleep method used in the previous example, to ensure that the instantiations occur more than 15 millisecond apart.
Получение целых чисел в указанном диапазоне Retrieve integers in a specified range
Вы можете получить целые числа в указанном диапазоне, вызвав Next(Int32, Int32) метод, который позволяет указать нижнюю и верхнюю границы чисел, которые нужно вернуть генератору случайных чисел. You can retrieve integers in a specified range by calling the Next(Int32, Int32) method, which lets you specify both the lower and the upper bound of the numbers you’d like the random number generator to return. Верхняя граница — это эксклюзивное, а не инклюзивное значение. The upper bound is an exclusive, not an inclusive, value. То есть он не включается в диапазон значений, возвращаемых методом. That is, it isn’t included in the range of values returned by the method. В следующем примере этот метод используется для создания случайных целых чисел от-10 до 10. The following example uses this method to generate random integers between -10 and 10. Обратите внимание, что в нем указано значение 11, которое больше, чем требуемое значение, в качестве значения maxValue аргумента в вызове метода. Note that it specifies 11, which is one greater than the desired value, as the value of the maxValue argument in the method call.
Получение целых чисел с указанным числом цифр Retrieve integers with a specified number of digits
Метод можно вызвать Next(Int32, Int32) для получения чисел с указанным числом цифр. You can call the Next(Int32, Int32) method to retrieve numbers with a specified number of digits. Например, чтобы получить числа с четырьмя цифрами (т. е. числа в диапазоне от 1000 до 9999), вызовите Next(Int32, Int32) метод со minValue значением 1000 и maxValue значением 10000, как показано в следующем примере. For example, to retrieve numbers with four digits (that is, numbers that range from 1000 to 9999), you call the Next(Int32, Int32) method with a minValue value of 1000 and a maxValue value of 10000, as the following example shows.
Получение значений с плавающей запятой в указанном диапазоне Retrieve floating-point values in a specified range
NextDoubleМетод возвращает случайные значения с плавающей запятой в диапазоне от 0 до меньше 1. The NextDouble method returns random floating-point values that range from 0 to less than 1. Однако часто требуется создавать случайные значения в каком бы то ни было другом диапазоне. However, you’ll often want to generate random values in some other range.
Если интервал между минимальным и максимальным требуемыми значениями равен 1, можно добавить разницу между требуемым начальным интервалом и значением 0 для числа, возвращаемого NextDouble методом. If the interval between the minimum and maximum desired values is 1, you can add the difference between the desired starting interval and 0 to the number returned by the NextDouble method. В следующем примере это делается для создания 10 случайных чисел в диапазоне от-1 до 0. The following example does this to generate 10 random numbers between -1 and 0.
Для создания случайных чисел с плавающей запятой, Нижняя граница которых равна 0, но верхняя граница больше 1 (или, в случае отрицательных чисел, Нижняя граница которой меньше-1, а верхняя граница равна 0), умножьте случайное число на ненулевую границу. To generate random floating-point numbers whose lower bound is 0 but upper bound is greater than 1 (or, in the case of negative numbers, whose lower bound is less than -1 and upper bound is 0), multiply the random number by the non-zero bound. В следующем примере это делается для создания 20 000 000 случайных чисел с плавающей запятой в диапазоне от 0 до Int64.MaxValue . The following example does this to generate 20 million random floating-point numbers that range from 0 to Int64.MaxValue. В также отображает распределение случайных значений, созданных методом. In also displays the distribution of the random values generated by the method.
Чтобы создать случайные числа с плавающей запятой между двумя произвольными значениями, например Next(Int32, Int32) метод для целых чисел, используйте следующую формулу: To generate random floating-point numbers between two arbitrary values, like the Next(Int32, Int32) method does for integers, use the following formula:
Следующий пример приводит к возникновению ошибки 1 000 000 случайных чисел в диапазоне от 10,0 до 11,0 и отображении их распределения. The following example generates 1 million random numbers that range from 10.0 to 11.0, and displays their distribution.
Создание случайных логических значений Generate random Boolean values
RandomКласс не предоставляет методы, создающие Boolean значения. The Random class doesn’t provide methods that generate Boolean values. Однако для этого можно определить собственный класс или метод. However, you can define your own class or method to do that. В следующем примере определяется класс BooleanGenerator с одним методом NextBoolean . The following example defines a class, BooleanGenerator , with a single method, NextBoolean . BooleanGenerator Класс сохраняет Random объект как закрытую переменную. The BooleanGenerator class stores a Random object as a private variable. NextBoolean Метод вызывает Random.Next(Int32, Int32) метод и передает результат в Convert.ToBoolean(Int32) метод. The NextBoolean method calls the Random.Next(Int32, Int32) method and passes the result to the Convert.ToBoolean(Int32) method. Обратите внимание, что в качестве аргумента используется 2, чтобы указать верхнюю границу случайного числа. Note that 2 is used as the argument to specify the upper bound of the random number. Так как это значение является эксклюзивным, вызов метода возвращает значение 0 или 1. Since this is an exclusive value, the method call returns either 0 or 1.
Вместо создания отдельного класса для создания случайных Boolean значений в примере можно просто определить один метод. Instead of creating a separate class to generate random Boolean values, the example could simply have defined a single method. Однако в этом случае Random объект должен быть определен как переменная уровня класса, чтобы избежать создания экземпляра нового Random экземпляра в каждом вызове метода. In that case, however, the Random object should have been defined as a class-level variable to avoid instantiating a new Random instance in each method call. В Visual Basic случайный экземпляр может быть определен как статическая переменная в NextBoolean методе. In Visual Basic, the Random instance can be defined as a Static variable in the NextBoolean method. В следующем примере показана реализация. The following example provides an implementation.
Создавать случайные 64-разрядные целые числа Generate random 64-bit integers
Перегрузки Next метода возвращают 32-разрядные целые числа. The overloads of the Next method return 32-bit integers. Однако в некоторых случаях может потребоваться работать с 64-разрядными целыми числами. However, in some cases, you might want to work with 64-bit integers. Это можно сделать следующим образом: You can do this as follows:
Вызовите NextDouble метод, чтобы получить значение двойной точности с плавающей запятой. Call the NextDouble method to retrieve a double-precision floating point value.
Умножьте это значение на Int64.MaxValue . Multiply that value by Int64.MaxValue.
В следующем примере этот метод используется для создания 20 000 000 случайных длинных целых чисел и классификации их в 10 равных группах. The following example uses this technique to generate 20 million random long integers and categorizes them in 10 equal groups. Затем он вычисляет распределение случайных чисел, подчисляя число в каждой группе от 0 до Int64.MaxValue . It then evaluates the distribution of the random numbers by counting the number in each group from 0 to Int64.MaxValue. Как видно из выходных данных примера, числа распределяются более или реже по диапазону длинного целого числа. As the output from the example shows, the numbers are distributed more or less equally through the range of a long integer.
Альтернативный метод, использующий побитовую обработку, не создает действительно случайных чисел. An alternative technique that uses bit manipulation does not generate truly random numbers. Этот метод вызывает метод Next() для создания двух целых чисел, сдвига влево по одному на 32 бит и or их вместе. This technique calls Next() to generate two integers, left-shifts one by 32 bits, and ORs them together. Этот метод имеет два ограничения: This technique has two limitations:
Поскольку бит 31 является битом знака, значение в битовом 31 полученного длинного целого числа всегда равно 0. Because bit 31 is the sign bit, the value in bit 31 of the resulting long integer is always 0. Это можно решить путем создания случайного значения 0 или 1, сдвига влево на 31 бит и индексами его с исходным произвольным целым числом. This can be addressed by generating a random 0 or 1, left-shifting it 31 bits, and ORing it with the original random long integer.
Более серьезно, поскольку вероятность того, что значение, возвращаемое, Next() будет равно 0, будет несколько случайных чисел в диапазоне 0x0-0x00000000FFFFFFFF. More seriously, because the probability that the value returned by Next() will be 0, there will be few if any random numbers in the range 0x0-0x00000000FFFFFFFF.
Извлечение байтов в указанном диапазоне Retrieve bytes in a specified range
Перегрузки Next метода позволяют указать диапазон случайных чисел, но NextBytes метод — нет. The overloads of the Next method allow you to specify the range of random numbers, but the NextBytes method does not. В следующем примере реализуется NextBytes метод, который позволяет указать диапазон возвращаемых байтов. The following example implements a NextBytes method that lets you specify the range of the returned bytes. Он определяет Random2 класс, производный от, Random и перегружает его NextBytes метод. It defines a Random2 class that derives from Random and overloads its NextBytes method.
NextBytes(Byte[], Byte, Byte) Метод создает оболочку для вызова Next(Int32, Int32) метода и задает минимальное значение, которое больше максимального значения (в данном случае 0 и 101), которое требуется вернуть в массив байтов. The NextBytes(Byte[], Byte, Byte) method wraps a call to the Next(Int32, Int32) method and specifies the minimum value and one greater than the maximum value (in this case, 0 and 101) that we want returned in the byte array. Так как мы уверены, что целочисленные значения, возвращаемые Next методом, находятся в диапазоне Byte типа данных, мы можем безопасно привести их (в C#) или преобразовать их (в Visual Basic) из целых чисел в байты. Because we are sure that the integer values returned by the Next method are within the range of the Byte data type, we can safely cast them (in C#) or convert them (in Visual Basic) from integers to bytes.
Извлечение элемента из массива или коллекции в случайном порядке Retrieve an element from an array or collection at random
Случайные числа часто используются в качестве индексов для получения значений из массивов или коллекций. Random numbers often serve as indexes to retrieve values from arrays or collections. Чтобы получить случайное значение индекса, можно вызвать Next(Int32, Int32) метод и использовать нижнюю границу массива в качестве значения его minValue аргумента, а на единицу больше, чем верхняя граница массива, в качестве значения его maxValue аргумента. To retrieve a random index value, you can call the Next(Int32, Int32) method, and use the lower bound of the array as the value of its minValue argument and one greater than the upper bound of the array as the value of its maxValue argument. Для массива, начинающегося с нуля, это эквивалентно его Length свойству или больше значения, возвращаемого Array.GetUpperBound методом. For a zero-based array, this is equivalent to its Length property, or one greater than the value returned by the Array.GetUpperBound method. В следующем примере случайным образом извлекается имя города в США из массива городов. The following example randomly retrieves the name of a city in the United States from an array of cities.
Извлечение уникального элемента из массива или коллекции Retrieve a unique element from an array or collection
Генератор случайных чисел всегда может возвращать дублирующиеся значения. A random number generator can always return duplicate values. Так как диапазон чисел становится меньше или число формируемых значений становится больше, вероятность повторений растет. As the range of numbers becomes smaller or the number of values generated becomes larger, the probability of duplicates grows. Если случайные значения должны быть уникальными, создаются дополнительные числа для компенсации дубликатов, что приводит к ухудшению производительности. If random values must be unique, more numbers are generated to compensate for duplicates, resulting in increasingly poor performance.
Существует ряд методов для решения этого сценария. There are a number of techniques to handle this scenario. Одним из распространенных решений является создание массива или коллекции, содержащей значения для извлечения, и параллельный массив, содержащий случайные числа с плавающей запятой. One common solution is to create an array or collection that contains the values to be retrieved, and a parallel array that contains random floating-point numbers. Второй массив заполняется случайными числами во время создания первого массива, а Array.Sort(Array, Array) метод используется для сортировки первого массива с использованием значений в параллельном массиве. The second array is populated with random numbers at the time the first array is created, and the Array.Sort(Array, Array) method is used to sort the first array by using the values in the parallel array.
Например, если вы разрабатываете игру «косынка», необходимо убедиться, что каждая карта используется только один раз. For example, if you’re developing a Solitaire game, you want to ensure that each card is used only once. Вместо создания случайных чисел для получения карты и отслеживания того, была ли карта уже обработана, можно создать параллельный массив случайных чисел, который можно использовать для сортировки колоды. Instead of generating random numbers to retrieve a card and tracking whether that card has already been dealt, you can create a parallel array of random numbers that can be used to sort the deck. После сортировки колоды приложение может поддерживать указатель, указывающий на индекс следующей карточки в колоде. Once the deck is sorted, your app can maintain a pointer to indicate the index of the next card on the deck.
Этот подход показан в приведенном ниже примере. The following example illustrates this approach. Он определяет Card класс, который представляет собой воспроизводимую карту, и Dealer класс, который обрабатывает колоду карточек с случайным перемещением. It defines a Card class that represents a playing card and a Dealer class that deals a deck of shuffled cards. Dealer Конструктор класса заполняет два массива: deck массив, имеющий область класса и представляющий все карты в колоде, и локальный order массив, имеющий то же количество элементов, что deck и массив, и заполняется случайным образом сгенерированными Double значениями. The Dealer class constructor populates two arrays: a deck array that has class scope and that represents all the cards in the deck; and a local order array that has the same number of elements as the deck array and is populated with randomly generated Double values. Array.Sort(Array, Array)Затем вызывается метод для сортировки массива на deck основе значений в order массиве. The Array.Sort(Array, Array) method is then called to sort the deck array based on the values in the order array.
Примечания для тех, кто наследует этот метод
В платформа .NET Framework 1,0 и 1,1 — минимальная реализация класса, производного от Random обязательного переопределения Sample() метода для определения нового или измененного алгоритма создания случайных чисел. In the .NET Framework 1.0 and 1.1, a minimum implementation of a class derived from Random required overriding the Sample() method to define a new or modified algorithm for generating random numbers. Производный класс может затем полагаться на реализацию базового класса Next() методов, Next(Int32) , Next(Int32, Int32) , NextBytes(Byte[]) и NextDouble() для вызова реализации метода производного класса Sample() . The derived class could then rely on the base class implementation of the Next(), Next(Int32), Next(Int32, Int32), NextBytes(Byte[]), and NextDouble() methods to call the derived class implementation of the Sample() method.
В платформа .NET Framework 2,0 и более поздних версиях поведение Next() Next(Int32, Int32) методов, и NextBytes(Byte[]) изменилось, так что эти методы не обязательно вызывают реализацию производного класса Sample() метода. In the .NET Framework 2.0 and later, the behavior of the Next(), Next(Int32, Int32), and NextBytes(Byte[]) methods have changed so that these methods do not necessarily call the derived class implementation of the Sample() method. В результате классы, производные от класса Random , предназначенного для платформа .NET Framework 2,0 и более поздних версий, также должны переопределять эти три метода. As a result, classes derived from Random that target the .NET Framework 2.0 and later should also override these three methods.
Примечания для тех, кто вызывает этот метод
Реализация генератора случайных чисел в Random классе не всегда остается одинаковой для основных версий платформа .NET Framework. The implementation of the random number generator in the Random class isn’t guaranteed to remain the same across major versions of the .NET Framework. В результате не следует рассчитывать на то, что одно и то же начальное значение приведет к той же псевдо-случайной последовательности в разных версиях платформа .NET Framework. As a result, you shouldn’t assume that the same seed will result in the same pseudo-random sequence in different versions of the .NET Framework.
Конструкторы
Инициализирует новый экземпляр класса Random, используя начальное значение по умолчанию. Initializes a new instance of the Random class using a default seed value.
Инициализирует новый экземпляр класса Random с помощью указанного начального значения. Initializes a new instance of the Random class, using the specified seed value.
Методы
Определяет, равен ли указанный объект текущему объекту. Determines whether the specified object is equal to the current object.
(Унаследовано от Object)
Служит хэш-функцией по умолчанию. Serves as the default hash function.
(Унаследовано от Object)
Возвращает объект Type для текущего экземпляра. Gets the Type of the current instance.
(Унаследовано от Object)
Создает неполную копию текущего объекта Object. Creates a shallow copy of the current Object.
(Унаследовано от Object)
Возвращает неотрицательное случайное целое число. Returns a non-negative random integer.
Возвращает неотрицательное случайное целое число, которое меньше указанного максимального значения. Returns a non-negative random integer that is less than the specified maximum.
Возвращает случайное целое число в указанном диапазоне. Returns a random integer that is within a specified range.
Заполняет элементы указанного массива байтов случайными числами. Fills the elements of a specified array of bytes with random numbers.
Заполняет элементы указанного диапазона байтов случайными числами. Fills the elements of a specified span of bytes with random numbers.
Возвращает случайное число с плавающей запятой, которое больше или равно 0,0 и меньше 1,0. Returns a random floating-point number that is greater than or equal to 0.0, and less than 1.0.
Возвращает случайное число с плавающей запятой в диапазоне от 0,0 до 1,0. Returns a random floating-point number between 0.0 and 1.0.
Возвращает строку, представляющую текущий объект. Returns a string that represents the current object.