• XSS.stack #1 – первый литературный журнал от юзеров форума

Алгоритм генерации случайных чисел

gemaglabin
Т.к. кроме random'а в нашем расопряжении, насколько мне известно, ничего нет, можешь попробовать, например, генерацию N чисел, запись их в массив и затем случайную выборку одного из них. Для большего усложнения можно воткнуть генерацию задержки (sleep() в делфи), использование арифмитических операций и т.д. и т.п.
Могу пример на Delpi написать.
 
gemaglabin
Наверное, избито, но посмотри здесь.
 
Чет смотрел-смотрел, так и не увидел чем отличается от Random() %)))

Если функа рандома вызывается часто, да еще и диапазон маленький(ну там 0-9), то повторяемость(при использовании Random()) будет частая – ИМХО(это даже "практикой доказано")
Помню, тоже казалась тема элементарной, банальной и тривиальной, а потом как выяснилось.. не все так просто %))
Вопрос был чисто теоретический(онлайн рулетки %))(что-то типа взлома rar-архива)), но проверялся практически. Короче.., тема была интересной..
Действительно, Ma-stiff(+1) правильно написал(единственное только sleep() не юзать), только таким способом можно добиться хорошего рандома и непредсказуемости

ЗЫ: я видел, что это никропостенг, но не сдержался.. - дополню немного :)
Из увиденных мной рандомов(класс), вот этот хорош – но, не идеален
http://www.dreamincode.net/code/snippet342.htm
Код:
Created - Sarah "Voodoo Doll" White (2006/01/24)
=============================
Description:
This class wraps the Mersenne Twister generator
with a public interface that supports three common...
после «// Voodoo to improve distribution» минимум хотя бы изменить
Здесь еще для полного эффекта, нужно применить вот этот алгоритм(затачивается под каждый конкретный случай по-разному)
http://www.programmersforum.ru/showthread.php?t=38141
Код:
var
  I, S, R: Integer;
begin
  for I := 0 to High(A) do
    A[i] := I;
  for i := High(A) downto 0 do
  begin
    R := Random(I);
    S := A[R];
    A[R] := A[i];
    A[i] := S;
  end;
end;
Генерим рандомные числа в массив с помощью класса(Mersenne Twister generator), а потом рандомим позиции этих чисел в массиве с помощью второго алго :)
Ну, это я так для размышлений, пример запостил – в реале же, нужно будет еще и напильником поработать, чтобы эти два метода соединить вместе %)))
ЗЫЫ: готовые решения - постить не умею ;)
 
Т.к. кроме random'а в нашем расопряжении, насколько мне известно, ничего нет, можешь попробовать, например, генерацию N чисел, запись их в массив и затем случайную выборку одного из них. Для большего усложнения можно воткнуть генерацию задержки (sleep() в делфи), использование арифмитических операций и т.д. и т.п.
Могу пример на Delpi написать.
и выборку делать с помощью рандома?

for I := 0 to 9 do
A := I;

Тогда, будет всеравно что использовать Random(10) или A[Random(10)]
 
Код:
DWORD rand_()
{
	DWORD random_seed = 0;
	DWORD res = 0;
	__asm
	{
    rdtsc
        xor     eax,edx
        mov     [random_seed],eax
        mov     eax,[random_seed]
        xor     edx,edx
        mov     ecx,127773
        div     ecx
        mov     ecx,eax
        mov     eax,16807
        mul     edx
        mov     edx,ecx
        mov     ecx,eax
        mov     eax,2836
        mul     edx
        sub     ecx,eax
        xor     edx,edx
        mov     eax,ecx
        mov     [random_seed],ecx
        mov     ecx,100000
        div     ecx
        mov res,edx
	}
	return res;
}
//пример
DWORD GetRandomByte()
{
	return rand_()%0xFF;
}
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх