PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Как написать генератор случайных чисел из чего попало


Как написать генератор случайных чисел из чего попало

Сообщений 1 страница 13 из 13

1

Код:
Global  BinaryRandomValue, BinaryRandomThread1,  BinaryRandomThread2

Procedure SetBinaryRandomDigitalNumber(Value)
  Repeat
    BinaryRandomValue  = Value
  ForEver
EndProcedure

ProcedureDLL  StartRandomizer()
  BinaryRandomThread1 = CreateThread(@SetBinaryRandomDigitalNumber(), 0)
  BinaryRandomThread2 = CreateThread(@SetBinaryRandomDigitalNumber(), 1)
EndProcedure

ProcedureDLL  StopRandomizer()
  KillThread(BinaryRandomThread1)
  KillThread(BinaryRandomThread2)
EndProcedure

ProcedureDLL  GetBinaryRandom()
  ProcedureReturn BinaryRandomValue
EndProcedure

Procedure SetBit(*Pointer.Integer, Position, Tension) 
  If Tension
    *Pointer\i | (1 << (Position  - 1))
  Else
    *Pointer\i & (255 - 1 << (Position  - 1))
  EndIf
EndProcedure

ProcedureDLL  GetRandom()
  For BitPosition = 1 To  64
    SetBit(@IntegerRandomValue, BitPosition,  BinaryRandomValue)
  Next
  ProcedureReturn IntegerRandomValue
EndProcedure

Можно и оптимальнее...
Данная реализация испытана только на двухядерном процессоре, а вообще я перепишу для всех количеств процессоров.

Отредактировано PSY (16.05.2024 11:03:37)

0

2

XOR shift будет побогаче.

0

3

Данный исходник только для двух ядер и если ввести Print() на консоль по моему предложенному методу писания 0 и 1 в двух потоках (для двух ядер только) то на консоле то нули то единицы.

0

4

Какие‐то потоки, бесконечные циклы…
Просто берите значение неинициализированной переменной. Вот вам случайное значение.

0

5

Замабувараев написал(а):

неинициализированной переменной

оно всегда 0 в PureBasic. Компилятор очищает участок памяти.

0

6

AZJIO написал(а):

оно всегда 0 в PureBasic. Компилятор очищает участок памяти.

AllocateMemory + #PB_Memory_NoClear

0

7

Как я понимаю, самое интересное, оценку качества этого "генератора" мы от автора не увидим.

0

8

Замабувараев написал(а):

AllocateMemory + #PB_Memory_NoClear

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

Я попробовал код

Код:
Debug GetRandom()
Debug GetBinaryRandom()

что-то нули выдаёт.

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

0

9

AZJIO написал(а):

а он мне прям несколько раз нули выдал.

Случайное число — это такое число, которое мы не может предсказать. Ноль — это тоже случайное число.

Может вам вместо случайного числа — нужна последовательность неповторяющихся чисел? Или равномерное распределение? Ну так это не случайная последовательность.

0

10

Замабувараев
По вашей теории выдавать всегда ноль можно считать что оно выпало случайно.

Замабувараев написал(а):

нужна последовательность неповторяющихся чисел?

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

Замабувараев написал(а):

Или равномерное распределение?

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

Отредактировано AZJIO (22.05.2024 13:06:02)

0

11

Замабувараев написал(а):

Случайное число — это такое число, которое мы не может предсказать. Ноль — это тоже случайное число.

Из серии "Занимательная демагогия"  :crazyfun:

0

12

Я просто перевёл в библиотеку, а вот насчёт её работоспособности только потом тестировал. Если выводить постоянно на консоль и писать в файл с FlushFileBuffers() то на консоли и нули и единицы. будут в зависимости от замедления компьютера. Для двух ядер - приведённый мною код - справедлив. А вот если более - то надо нагружать больше. Вообще, я просто давно уже такое мостырил и при выводе на консоль пахало нормально вроде бы.

0

13

Дожили. Нынешнее "генерейшен" даже псевдослучайные числа на одном ядре сгенерировать не могут.

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Как написать генератор случайных чисел из чего попало