Есть же алгоритм, который высчитывает случайное число . интересно, как он устроен?
» Интересный вопрос...
2Polkan
смотри в исходниках
например на Delphi
procedure _RandInt;
asm
{ ->EAX Range }
{ <-EAX Result }
PUSH EBX
{$IFDEF PIC}
PUSH EAX
CALL GetGOT
MOV EBX,EAX
POP EAX
MOV ECX,[EBX].OFFSET RandSeed
IMUL EDX,[ECX],08088405H
INC EDX
MOV [ECX],EDX
{$ELSE}
XOR EBX, EBX
IMUL EDX,[EBX].RandSeed,08088405H
INC EDX
MOV [EBX].RandSeed,EDX
{$ENDIF}
MUL EDX
MOV EAX,EDX
POP EBX
end;
смотри в исходниках
например на Delphi
procedure _RandInt;
asm
{ ->EAX Range }
{ <-EAX Result }
PUSH EBX
{$IFDEF PIC}
PUSH EAX
CALL GetGOT
MOV EBX,EAX
POP EAX
MOV ECX,[EBX].OFFSET RandSeed
IMUL EDX,[ECX],08088405H
INC EDX
MOV [ECX],EDX
{$ELSE}
XOR EBX, EBX
IMUL EDX,[EBX].RandSeed,08088405H
INC EDX
MOV [EBX].RandSeed,EDX
{$ENDIF}
MUL EDX
MOV EAX,EDX
POP EBX
end;
MoKC0DeR
мда, вот они - плоды просвещения...
2Polkan
читать второй том кнута, глава 3, случайные числа
мда, вот они - плоды просвещения...
2Polkan
читать второй том кнута, глава 3, случайные числа
redp
Не понял про "плоды просвещения"
Не понял про "плоды просвещения"
Вот оно что :))))). можно закрывать :)). спасибо за ответ ;)
>Есть же алгоритм, который высчитывает случайное число . интересно, как он устроен?
Называется получение псевдо-случаной последовательности...
Называется получение псевдо-случаной последовательности...
MoKC0DeR
абисняю - в качестве ответа на вопрос незнакомым людям предлагать кусок кода на асме, ничо при этом не объясняя - неэтично
абисняю - в качестве ответа на вопрос незнакомым людям предлагать кусок кода на асме, ничо при этом не объясняя - неэтично
Интересен вопрос о "CALL GetGOT". может разберём дословно этот пример и покажем начинающим суть? Приведу функцию GetGOT и вы поймёте моё недовольствие (или я ошибаюсь?)
Код:
{$IFDEF PIC}
function GetGOT: LongWord; export;
begin
asm
MOV Result,EBX
end;
end;
{$ENDIF}
Код:
{$IFDEF PIC}
function GetGOT: LongWord; export;
begin
asm
MOV Result,EBX
end;
end;
{$ENDIF}
все очень просто...
берутся сотые доли секунды текущего времени на машине (как наиболее динамично изменяющаяся величина) и из них все получают...
поэтому и называется это хозяйство псевдослучайной величиной...
берутся сотые доли секунды текущего времени на машине (как наиболее динамично изменяющаяся величина) и из них все получают...
поэтому и называется это хозяйство псевдослучайной величиной...
redp
Ну простите я ожидаю от человека хотябы элементарных знаний
Ну простите я ожидаю от человека хотябы элементарных знаний
akaGM
Цитата:
Бред. Если бы я на таком генераторе вычислял интеграл методом Монте-Карло, получал бы всегда один результат. Однако, поди ж ты, они разные (разница тем меньше, чем больше значений я беру). Да, Кнута читать неплохо.
Добавлено:
akaGM
Цитата:
Бред. Если бы я на таком генераторе вычислял интеграл методом Монте-Карло, получал бы всегда один результат. Однако, поди ж ты, они разные (разница тем меньше, чем больше значений я беру). Да, Кнута читать неплохо.
Цитата:
берутся сотые доли секунды текущего времени на машине (как наиболее динамично изменяющаяся величина) и из них все получают...
Бред. Если бы я на таком генераторе вычислял интеграл методом Монте-Карло, получал бы всегда один результат. Однако, поди ж ты, они разные (разница тем меньше, чем больше значений я беру). Да, Кнута читать неплохо.
Добавлено:
akaGM
Цитата:
берутся сотые доли секунды текущего времени на машине (как наиболее динамично изменяющаяся величина) и из них все получают...
Бред. Если бы я на таком генераторе вычислял интеграл методом Монте-Карло, получал бы всегда один результат. Однако, поди ж ты, они разные (разница тем меньше, чем больше значений я беру). Да, Кнута читать неплохо.
уважаемый TheChampion
гы
и даже дважды...
гы-гы
я говорю не о принцип. алгоритме, а о том, что явл. основой (входными данными) для его
_реализации_ на ПиСи...
что по-твоему RandSeed?
RandSeed := GetTickCount; например...
или вот так, если тебе это более привычно:
RandSeed := _time(nil);
--------
а по поводу ММК -- мы сами с усами...
http://www.crys.ras.ru/quasicrystals/
один из авторов -- ваш покорный...
гы
и даже дважды...
гы-гы
я говорю не о принцип. алгоритме, а о том, что явл. основой (входными данными) для его
_реализации_ на ПиСи...
что по-твоему RandSeed?
RandSeed := GetTickCount; например...
или вот так, если тебе это более привычно:
RandSeed := _time(nil);
--------
а по поводу ММК -- мы сами с усами...
http://www.crys.ras.ru/quasicrystals/
один из авторов -- ваш покорный...
в Хакере даже конкурс был - написать свою прогу, генерирующую случ. числа... на любом языке...
>берутся сотые доли секунды текущего времени на машине (как наиболее динамично изменяющаяся величина) и из них все получают...
Нам в университете как-то по другому давали. Именно последовательность без привязки к таймеру.
Нам в университете как-то по другому давали. Именно последовательность без привязки к таймеру.
правильно вам все давали...
я тоже могу сейчас завалить вас алгоритмами генерации с почти любым распределением (и нормальным и биноминальным и гамма- и тд и тп)...
но, братцы, мы же о разных вещах говорим...
алгоритм и его реализация...
что бы запустить (_любой_) алгоритм генерации случайной последовательности, вам необходимо инициализировать генератор...
так вот на компьютерах, как правило, используют для этих целей тактовый генератор, а попросту говоря -- системный таймер...
посмотрите любые исходники любых библиотек...
я тоже могу сейчас завалить вас алгоритмами генерации с почти любым распределением (и нормальным и биноминальным и гамма- и тд и тп)...
но, братцы, мы же о разных вещах говорим...
алгоритм и его реализация...
что бы запустить (_любой_) алгоритм генерации случайной последовательности, вам необходимо инициализировать генератор...
так вот на компьютерах, как правило, используют для этих целей тактовый генератор, а попросту говоря -- системный таймер...
посмотрите любые исходники любых библиотек...
akaGM
Цитата:
Не стоит путать божий дар с яичницей.
Заметь, что ты инициализируешь генератор таймером, но не используешь таймер для вычислений случайного числа. С тем же успехом ты можешь взять значение слова по адресу 0x123456. Так что тройное ха-ха!
Цитата:
я говорю не о принцип. алгоритме, а о том, что явл. основой (входными данными) для его
_реализации_ на ПиСи...
Не стоит путать божий дар с яичницей.
Заметь, что ты инициализируешь генератор таймером, но не используешь таймер для вычислений случайного числа. С тем же успехом ты можешь взять значение слова по адресу 0x123456. Так что тройное ха-ха!
ладно, закругляемся...
в качестве PS
гы-гы было направлено не на твои высказывания, а лишь на количество попыток обвинить меня в бреде...
в качестве PS
гы-гы было направлено не на твои высказывания, а лишь на количество попыток обвинить меня в бреде...
кстати я тут делал покер на си++ билдере и выяснил,что Random(x) процентах в 90 случаев выдает одинаковые первые числа, в частности у меня это выражалось в том, что каждый раз в начале игры мне вылетали одинаковые карты, пришлось делать свой генератор на основе текущего времени(обрабатывал секунды, минуты, часы)
modulo
Это не баг, это фича. Вначале все последовательности будут одинаковые. Если хочешь разные --- сделай randomize() перед вызовом rand().
Стандартную библиотеку надо знать!
Это не баг, это фича. Вначале все последовательности будут одинаковые. Если хочешь разные --- сделай randomize() перед вызовом rand().
Стандартную библиотеку надо знать!
так я делаю рандомайз, у меня была функция перетусовки колоды в ней естественно сначала прописано randomize(), а потом где надо random()
modulo
Цитата:
Код:
так?
shuffle() {
cardKind = random();
cardNum = random();
}
main() {
randomize();
do { //gameloop
...
shuffle()
...
}
}
или так?
shuffle() {
randomize();
cardKind = random();
cardNum = random();
}
main() {
do { //gameloop
...
shuffle()
...
}
}
Цитата:
у меня была функция перетусовки колоды в ней естественно сначала прописано randomize(), а потом где надо random()
Код:
так?
shuffle() {
cardKind = random();
cardNum = random();
}
main() {
randomize();
do { //gameloop
...
shuffle()
...
}
}
или так?
shuffle() {
randomize();
cardKind = random();
cardNum = random();
}
main() {
do { //gameloop
...
shuffle()
...
}
}
у меня второй вариант, но почему!!????
какая разница????
я думал наоборот, чем больше будет выполняться randomize, тем случайнее будет комбинация
какая разница????
я думал наоборот, чем больше будет выполняться randomize, тем случайнее будет комбинация
да потому что в этом случае ты всегда приводишь генератор в начальное состояние...
попробуй код (сделай два экзюка):
Код:
void main () {
int i;
randomize();
for (i = 0; i < 10; i++)
printf("%d\n", (int)random(100)+1);
}
попробуй код (сделай два экзюка):
Код:
void main () {
int i;
randomize();
for (i = 0; i < 10; i++)
printf("%d\n", (int)random(100)+1);
}
modulo
И что же? Все равно повторяются?
И что же? Все равно повторяются?
!оффтоп этого трейда...
TheChampion
я тебе немного инфы нарыл, глянь если еще не видел...
http://forum.ru-board.com/topic.cgi?forum=33&topic=4499#1
TheChampion
я тебе немного инфы нарыл, глянь если еще не видел...
http://forum.ru-board.com/topic.cgi?forum=33&topic=4499#1
modulo
Я не нашел функцию randomize в стандарте, но там написано, что
2 The rand function computes a sequence of pseudo-random integers in the range 0 to
RAND_MAX.
а также
2 The srand function uses the argument as a seed for a new sequence of pseudo-random
numbers to be returned by subsequent calls to rand. If srand is then called with the
same seed value, the sequence of pseudo-random numbers shall be repeated. If rand is
called before any calls to srand have been made, the same sequence shall be generated
as when srand is first called with a seed value of 1.
akaGM
Спасибо, я видел
Я не нашел функцию randomize в стандарте, но там написано, что
2 The rand function computes a sequence of pseudo-random integers in the range 0 to
RAND_MAX.
а также
2 The srand function uses the argument as a seed for a new sequence of pseudo-random
numbers to be returned by subsequent calls to rand. If srand is then called with the
same seed value, the sequence of pseudo-random numbers shall be repeated. If rand is
called before any calls to srand have been made, the same sequence shall be generated
as when srand is first called with a seed value of 1.
akaGM
Спасибо, я видел
на всякий случай...
стандартными считаются
int rand() и (реже) long lrand()
void srand() -- пускач
а random randomize -- Борландовские макросы (речь шла о написании программы под Билдером)
стандартными считаются
int rand() и (реже) long lrand()
void srand() -- пускач
а random randomize -- Борландовские макросы (речь шла о написании программы под Билдером)
короче я всё-равно сделал свой отличный рандомайзер и наплевать на эти стандартные ф-ии, как говорится "if you want something done, do it yourself"
modulo
Цитата:
Проверял? Соседние значения вправду не коррелируют? (см. Кнут, т. 2)
Цитата:
А STL пробовал переписать?
Цитата:
короче я всё-равно сделал свой отличный рандомайзер
Проверял? Соседние значения вправду не коррелируют? (см. Кнут, т. 2)
Цитата:
и наплевать на эти стандартные ф-ии, как говорится "if you want something done, do it yourself"
А STL пробовал переписать?
Цитата:
Соседние значения вправду не коррелируют?
издеваешься?
Предыдущая тема: Помощь по СИ
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.