Генерация по-настоящему случайных чисел без специального устройства (список),
являющегося интерфейсом к какому-нибудь физическому явлению - невозможна,
так как все вычисления происходящие внутри компа неслучайны...
Может быть в KolibriOS есть отличный генератор псевдослучайных чисел?
(интересует что-нибудь получше чем через "метод серединных квадратов")
Нашёл HMAC из маленькой библиотеки TLS, но в KolibriOS он не входит
Есть ли в KolibriOS отличный Генератор ПсевдоСлучайных Чисел?
Если честно, то смутно припоминаю, что кто-то выкладывал вполне простой код на асме, дающий случайные псевдочисла. Но уже не вспомню где. Поиск по форуму пробовал?
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!
Да, и там использовался метод серединных квадратов. а я надеюсь, что:GerdtR wrote:Если честно, то смутно припоминаю, что кто-то выкладывал вполне простой код на асме, дающий случайные псевдочисла
1) есть генератор покруче, дающий более похожие на рандом числа
2) и уже встроен в Kolibri, например какая-то системная функция в API
Недавно реализовывал очень простой и удобный алгоритм - но не нашел близко.
Вот нагуглилось в Хакере прямо на ассемблере
https://xakep.ru/2005/01/19/25259/
Для рандомизации же можно взять системный наносекундный таймер
Вот нагуглилось в Хакере прямо на ассемблере
https://xakep.ru/2005/01/19/25259/
Для рандомизации же можно взять системный наносекундный таймер
Нет, системной функции, выдающей псевдослучайные числа на данный момент не существует.
Вполне достаточно инструкции rdtsc.Siemargl wrote:Для рандомизации же можно взять системный наносекундный таймер
GerdtR wrote:кто-то выкладывал вполне простой код на асме
Найти простой код можно и на С, например http://web.tiscali.it/pas80/random.htm Но ведь автора вопроса интересует именно тот, который уже встроен в Kolibri.Siemargl wrote:Вот нагуглилось в Хакере прямо на ассемблере
Благодарю за ответ! Получается, если понадобится рандом - нужно будет подтянуть его в конкретное приложение, потому что я пока не знаю как добавить системную функцию; к тому же могут возникнуть споры, какой вариант рандома лучше и более достоин включения в ядро0CodErr wrote:Нет, системной функции, выдающей псевдослучайные числа на данный момент не существует
Спасибо, может пригодиться! Кстати, нашёл вторую часть этот статьи - https://xakep.ru/2005/01/20/25272/Siemargl wrote:Вот нагуглилось в Хакере прямо на ассемблере - https://xakep.ru/2005/01/19/25259/
- там рандом получше, тоже на ассемблере и тоже прошёл тест DIEHARD, но его период 2^128-1 против 2^125 из прошлой
хорошая идея; можно дополнить координатами курсора мышкиSiemargl wrote:Для рандомизации же можно взять системный наносекундный таймер
Нашел хороший быстрый и простой алгоритм, о котором говорил ранее
скомпилированная в ассемблер целочисленная
Code: Select all
//Marsaglia's MWC (multiply with carry) algorithm
static uint32_t m_z = 333, m_w = 888; // any seeds not null
uint32_t GetUint()
{
m_z = 36969 * (m_z & 65535) + (m_z >> 16);
m_w = 18000 * (m_w & 65535) + (m_w >> 16);
return (m_z << 16) + m_w;
}
double GetUniform()
{
// 0 <= u < 2^32
uint32_t u = GetUint();
// The magic number below is 1/(2^32 + 2).
// The result is strictly between 0 and 1.
return (u + 1.0) * 2.328306435454494e-10;
}
Code: Select all
GetUint:
mov eax, DWORD PTR m_z
movzx edx, ax
imul edx, edx, 36969
shr eax, 16
add eax, edx
mov DWORD PTR m_z, eax
mov edx, DWORD PTR m_w
movzx ecx, dx
imul ecx, ecx, 18000
shr edx, 16
add edx, ecx
mov DWORD PTR m_w, edx
sal eax, 16
add eax, edx
ret
m_w:
.long 888
m_z:
.long 333
Благодарю, довольно эффективный код и не должно составить труда адаптировать для FASMSiemargl wrote:Нашел хороший быстрый и простой алгоритм, о котором говорил ранее
Честно признаться, я поздно заметил твоё сообщение и в итоге извлёк PRNG из библиотеки TLS-Library, там HMAC / PFR :
viewtopic.php?f=2&t=3736 Example of using TLS-Library parts for generating PRNG numbers
Разумеется он намного жирнее, остаётся лишь надеятся что эта "жирнота" оправдана и он хоть нанемного лучше в плане рандомности...
А в качестве сида я использую энтропию извлекаемую из 5 функций:
viewtopic.php?f=2&t=3735 Функции-"источники энтропии" для качественного рандома? + пример
http://www.agner.org/random/
http://websvn.kolibrios.org/filedetails ... random.inc
Of course, you need to properly seed it.
http://websvn.kolibrios.org/filedetails ... random.inc
Of course, you need to properly seed it.
"Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." Albert Einstein
Вот на этом сайте http://simul.iro.umontreal.ca есть некоторые генераторы: http://simul.iro.umontreal.ca/rng
НапримерВозможно, кому-то будет интересно http://www-labs.iro.umontreal.ca/~simul ... collection of utilities for the empirical statistical testing of uniform random number generators[/quote]В User’s guide http://www-labs.iro.umontreal.ca/~simul ... estu01.pdf есть описания и формулы генераторов.
Например
Code: Select all
/*
32-bits Random number generator U[0,1): lfsr113
Author: Pierre L'Ecuyer,
Source: http://www.iro.umontreal.ca/~lecuyer/myftp/papers/tausme2.ps
---------------------------------------------------------
*/
#include "lfsr113.h"
#include <stdint.h>
/**** VERY IMPORTANT **** :
The initial seeds z1, z2, z3, z4 MUST be larger than
1, 7, 15, and 127 respectively.
****/
#define SEED 987654321
static uint32_t z1 = SEED, z2 = SEED, z3 = SEED, z4 = SEED;
double lfsr113 (void)
{
uint32_t b;
b = ((z1 << 6) ^ z1) >> 13;
z1 = ((z1 & 4294967294U) << 18) ^ b;
b = ((z2 << 2) ^ z2) >> 27;
z2 = ((z2 & 4294967288U) << 2) ^ b;
b = ((z3 << 13) ^ z3) >> 21;
z3 = ((z3 & 4294967280U) << 7) ^ b;
b = ((z4 << 3) ^ z4) >> 12;
z4 = ((z4 & 4294967168U) << 13) ^ b;
return (z1 ^ z2 ^ z3 ^ z4) * 2.3283064365386963e-10;
}
Для не очень критичных задач вполне подойдут более простые способы, например, такой:В архиве пример для UASM и KolibriOS.lib Вывод результата:
Code: Select all
.Data
RandSeed Dword 0
.Code
; ******************************************************************************
; Initialize the random-number generator
Randomize Proc
rdtsc
mov RandSeed, eax
ret
Randomize EndP
; ******************************************************************************
; Produce random values in a given range [MinValue..MaxValue]
Random Proc MinValue:Dword, MaxValue:Dword
mov eax, 134775813
mul RandSeed
inc eax
mov RandSeed, eax
mov edx, MaxValue
sub edx, MinValue
inc edx
mul edx
mov eax, edx
add eax, MinValue
ret
Random EndP