Генерация по-настоящему случайных чисел без специального устройства (список),
являющегося интерфейсом к какому-нибудь физическому явлению - невозможна,
так как все вычисления происходящие внутри компа неслучайны...
Может быть в 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
Spoiler:
Who is online
Users browsing this forum: Bing [Bot] and 2 guests