Как и принцип случайных чисел в Java
Проверьте информацию, связанную с случайными числами, и организуйте ее специально
Во -первых, давайте поговорим о нескольких способах генерирования случайных чисел в Java
Поступка Полем Полем Фактически, третий метод выше используется для генерации случайных чисел в методе построения по умолчанию Random.
Есть два способа построить случайный класс в методе 2: с семенами и без семян
Без семян: этот метод будет возвращать случайные числа, и результаты каждого прогона различны, что эквивалентно использованию System.currentTimeMillis () в качестве семян.
С семенами: таким образом, результат возврата будет одинаковым, независимо от того, сколько раз проводятся программа. Если два случайных экземпляра создаются с одним и тем же семенем, в каждом экземпляре производится одна и та же последовательность вызовов методов, и они будут генерировать и возвращать одну и ту же последовательность чисел.
Псевдо-раномный номер
Случайные числа на компьютерах-это псевдолудочные числа
Вот программа C, как это:
// rand_1.cpp#включить <stdlib.h> static unsigned int int rand_seed; unsigned int random (void) {rand_seed = (rand_seed*123+59)%65536; return (rand_seed);} void random_start (void) {int temp [2]; rowtata (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4); Rand_seed = temp [0];} void main () {unsigned int i, n; random_start (); for (i = 0; i <10; i ++) printf ("#u/t", random ()); printf ("/n");} Он полностью объясняет процесс генерации случайных чисел:
первый,
rowtata (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4);
Эта функция используется для перемещения данных памяти. FP_SEG (далеко указатель на сегмент) - это функция, которая принимает адрес сегмента временного массива, FP_OFF (дальний указатель на смещение) - это функция, которая принимает относительный адрес матрицы температуры, а функция Movatata - двойные слова, расположенные в единице 0040: 006CH, в два подразделения памяти, объявленные The Tep Temp. Таким образом, 16-битный номер на 0040: 006CH может быть отправлен в RAND_SEED через временный массив.
Второй,
Rand_seed = (rand_seed*123+59)%65536;
Это метод, используемый для расчета случайных чисел. Метод расчета случайных чисел отличается в разных компьютерах, даже в разных операционных системах, установленных на одном компьютере. Я пробовал это в Linux и Windows соответственно. Случайные числа, генерируемые одними и теми же случайными семенами в этих двух операционных системах, различны, что означает, что они имеют разные методы расчета.
Затем,
rowtata (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4);
Почему случайные семена должны быть извлечены в 0040: 006CH в памяти? Что хранится по адресу 0040: 006ch?
Те, кто изучал курс «Принципы компьютерных компонентов и технологии интерфейса», могут помнить, что при составлении программы обслуживания ROM Bios Bios Clock прерывания используется время/счетчик Intel 8253. Его связь с чипом прерывания Intel 8259 позволяет работать программа службы прерывания. Прерывания 18.2, сгенерированные материнской платой в секунду, генерируются процессором, управляющим чипом прерывания на основе значения времени/счетчика. На материнской плате нашего компьютера есть такое время/счетчик для расчета текущего системного времени. Счетчик будет добавляться каждый раз, когда проходит цикл тактового сигнала. Где хранится значение этого счетчика? Правильно, только на 0040: 006CH в памяти, это пространство памяти фактически определяется так:
Timer_low dw ?; Адрес 0040: 006CH
Timer_high dw ?; Адрес 0040: 006EH
Timer_oft db? ; Адрес 0040: 0070h
В программе службы прерываний часов, когда Timer_low становится полным, счетчик также будет полным, а значение счетчика равна нулю, то есть 16-битный двоичный файл на timer_low-обнуляется, а Timer_high добавляется один. в rand01.c
rowtata (0x0040,0x006c, fp_seg (temp), fp_off (temp), 4);
Именно два 16-битных бинарных номеров Timer_low и Timer_high помещаются в массив Temp и отправляются в Rand_seed, получая таким образом «случайное семя».
Теперь одна вещь, которая может быть определена, это то, что случайное семя исходит от системных часов, или, скорее, значения записи в памяти от времени/счетчика на материнской плате компьютера.
Ru ... не последним. Полем lvl--
Давайте посмотрим на другой кусок кода:
//rand_2.cpp#include <iostream> #include <cstdlib> с использованием пространства имен std; int main () {srand ((unsigned) time (null)); unsigned int r = rand (); cout << "r =" << r << endl; // Согласно стандарту C ++ 98, основная функция может быть введена без использования оператора возврата для возврата 0;} Здесь, если пользователь и другие программы не устанавливают случайное семя, значение времени/счетчика системы используется в качестве случайного семена. Следовательно, в той же среде платформы, после компиляции и генерации EXE, каждый раз, когда вы запускаете его, отображаемое случайное число будет псевдолупольным номером, то есть отображаемые результаты будут разными каждый раз, когда вы запустите его.
Суммировать
Случайные числа - это значения, рассчитанные по случайным семенам на основе определенных методов расчета. Следовательно, до тех пор, пока метод расчета определенным и случайное семя является определенным, генерируемое случайное число не изменится. В той же среде платформы, после компиляции и генерации EXE, отображаемые случайные числа одинаковы каждый раз, когда вы его запускаете. Это связано с тем, что в той же среде компиляционной платформы методы расчета для генерации случайных чисел из случайных семян одинаковы, а случайные семена одинаковы, поэтому генерируемые случайные числа одинаковы.
Пока пользователь или третья сторона не устанавливают случайное семя, то по умолчанию случайное семя исходит от системных часов (то есть значение времени/счетчика)
Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!