Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Интересный вопрос...

Автор: 2Polkan
Дата сообщения: 20.01.2005 17:28
Есть же алгоритм, который высчитывает случайное число . интересно, как он устроен?
Автор: MoKC0DeR
Дата сообщения: 20.01.2005 17:46
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;
Автор: redp
Дата сообщения: 20.01.2005 17:55
MoKC0DeR
мда, вот они - плоды просвещения...

2Polkan
читать второй том кнута, глава 3, случайные числа
Автор: MoKC0DeR
Дата сообщения: 20.01.2005 20:28
redp
Не понял про "плоды просвещения"
Автор: 2Polkan
Дата сообщения: 21.01.2005 02:16
Вот оно что :))))). можно закрывать :)). спасибо за ответ ;)
Автор: YurikGL
Дата сообщения: 21.01.2005 06:57
>Есть же алгоритм, который высчитывает случайное число . интересно, как он устроен?

Называется получение псевдо-случаной последовательности...
Автор: redp
Дата сообщения: 21.01.2005 10:38
MoKC0DeR
абисняю - в качестве ответа на вопрос незнакомым людям предлагать кусок кода на асме, ничо при этом не объясняя - неэтично
Автор: OdesitVadim
Дата сообщения: 21.01.2005 12:47
Интересен вопрос о "CALL GetGOT". может разберём дословно этот пример и покажем начинающим суть? Приведу функцию GetGOT и вы поймёте моё недовольствие (или я ошибаюсь?)

Код:
{$IFDEF PIC}
function GetGOT: LongWord; export;
begin
asm
MOV Result,EBX
end;
end;
{$ENDIF}
Автор: akaGM
Дата сообщения: 22.01.2005 16:12
все очень просто...
берутся сотые доли секунды текущего времени на машине (как наиболее динамично изменяющаяся величина) и из них все получают...
поэтому и называется это хозяйство псевдослучайной величиной...
Автор: MoKC0DeR
Дата сообщения: 22.01.2005 19:37
redp
Ну простите я ожидаю от человека хотябы элементарных знаний
Автор: TheChampion
Дата сообщения: 23.01.2005 09:31
akaGM

Цитата:
берутся сотые доли секунды текущего времени на машине (как наиболее динамично изменяющаяся величина) и из них все получают...


Бред. Если бы я на таком генераторе вычислял интеграл методом Монте-Карло, получал бы всегда один результат. Однако, поди ж ты, они разные (разница тем меньше, чем больше значений я беру). Да, Кнута читать неплохо.


Добавлено:
akaGM

Цитата:
берутся сотые доли секунды текущего времени на машине (как наиболее динамично изменяющаяся величина) и из них все получают...


Бред. Если бы я на таком генераторе вычислял интеграл методом Монте-Карло, получал бы всегда один результат. Однако, поди ж ты, они разные (разница тем меньше, чем больше значений я беру). Да, Кнута читать неплохо.
Автор: akaGM
Дата сообщения: 23.01.2005 16:22
уважаемый TheChampion
гы
и даже дважды...
гы-гы

я говорю не о принцип. алгоритме, а о том, что явл. основой (входными данными) для его
_реализации_ на ПиСи...

что по-твоему RandSeed?

RandSeed := GetTickCount; например...

или вот так, если тебе это более привычно:
RandSeed := _time(nil);

--------
а по поводу ММК -- мы сами с усами...

http://www.crys.ras.ru/quasicrystals/

один из авторов -- ваш покорный...
Автор: 2Polkan
Дата сообщения: 23.01.2005 17:48
в Хакере даже конкурс был - написать свою прогу, генерирующую случ. числа... на любом языке...
Автор: YurikGL
Дата сообщения: 23.01.2005 19:27
>берутся сотые доли секунды текущего времени на машине (как наиболее динамично изменяющаяся величина) и из них все получают...

Нам в университете как-то по другому давали. Именно последовательность без привязки к таймеру.
Автор: akaGM
Дата сообщения: 23.01.2005 20:02
правильно вам все давали...

я тоже могу сейчас завалить вас алгоритмами генерации с почти любым распределением (и нормальным и биноминальным и гамма- и тд и тп)...
но, братцы, мы же о разных вещах говорим...

алгоритм и его реализация...

что бы запустить (_любой_) алгоритм генерации случайной последовательности, вам необходимо инициализировать генератор...

так вот на компьютерах, как правило, используют для этих целей тактовый генератор, а попросту говоря -- системный таймер...
посмотрите любые исходники любых библиотек...
Автор: TheChampion
Дата сообщения: 24.01.2005 09:39
akaGM


Цитата:
я говорю не о принцип. алгоритме, а о том, что явл. основой (входными данными) для его
_реализации_ на ПиСи...


Не стоит путать божий дар с яичницей.

Заметь, что ты инициализируешь генератор таймером, но не используешь таймер для вычислений случайного числа. С тем же успехом ты можешь взять значение слова по адресу 0x123456. Так что тройное ха-ха!
Автор: akaGM
Дата сообщения: 24.01.2005 15:13
ладно, закругляемся...

в качестве PS
гы-гы было направлено не на твои высказывания, а лишь на количество попыток обвинить меня в бреде...
Автор: modulo
Дата сообщения: 28.01.2005 08:49
кстати я тут делал покер на си++ билдере и выяснил,что Random(x) процентах в 90 случаев выдает одинаковые первые числа, в частности у меня это выражалось в том, что каждый раз в начале игры мне вылетали одинаковые карты, пришлось делать свой генератор на основе текущего времени(обрабатывал секунды, минуты, часы)
Автор: TheChampion
Дата сообщения: 28.01.2005 09:11
modulo
Это не баг, это фича. Вначале все последовательности будут одинаковые. Если хочешь разные --- сделай randomize() перед вызовом rand().

Стандартную библиотеку надо знать!
Автор: modulo
Дата сообщения: 28.01.2005 10:02
так я делаю рандомайз, у меня была функция перетусовки колоды в ней естественно сначала прописано randomize(), а потом где надо random()
Автор: akaGM
Дата сообщения: 28.01.2005 14:04
modulo

Цитата:
у меня была функция перетусовки колоды в ней естественно сначала прописано randomize(), а потом где надо random()



Код:
так?

shuffle() {
cardKind = random();
cardNum = random();
}

main() {
randomize();
do { //gameloop
...
shuffle()
...
}
}

или так?

shuffle() {
randomize();
cardKind = random();
cardNum = random();
}

main() {
do { //gameloop
...
shuffle()
...
}
}
Автор: modulo
Дата сообщения: 28.01.2005 14:15
у меня второй вариант, но почему!!????
какая разница????
я думал наоборот, чем больше будет выполняться randomize, тем случайнее будет комбинация
Автор: akaGM
Дата сообщения: 28.01.2005 15:33
да потому что в этом случае ты всегда приводишь генератор в начальное состояние...

попробуй код (сделай два экзюка):

Код:
void main () {
int i;
randomize();
for (i = 0; i < 10; i++)
printf("%d\n", (int)random(100)+1);
}
Автор: TheChampion
Дата сообщения: 28.01.2005 16:35
modulo

И что же? Все равно повторяются?
Автор: akaGM
Дата сообщения: 28.01.2005 16:58
!оффтоп этого трейда...

TheChampion
я тебе немного инфы нарыл, глянь если еще не видел...
http://forum.ru-board.com/topic.cgi?forum=33&topic=4499#1
Автор: TheChampion
Дата сообщения: 28.01.2005 18:08
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
Спасибо, я видел
Автор: akaGM
Дата сообщения: 28.01.2005 19:17
на всякий случай...

стандартными считаются
int rand() и (реже) long lrand()
void srand() -- пускач

а random randomize -- Борландовские макросы (речь шла о написании программы под Билдером)
Автор: modulo
Дата сообщения: 29.01.2005 08:57
короче я всё-равно сделал свой отличный рандомайзер и наплевать на эти стандартные ф-ии, как говорится "if you want something done, do it yourself"
Автор: TheChampion
Дата сообщения: 29.01.2005 10:08
modulo

Цитата:
короче я всё-равно сделал свой отличный рандомайзер

Проверял? Соседние значения вправду не коррелируют? (см. Кнут, т. 2)

Цитата:
и наплевать на эти стандартные ф-ии, как говорится "if you want something done, do it yourself"

А STL пробовал переписать?
Автор: modulo
Дата сообщения: 29.01.2005 10:28

Цитата:
Соседние значения вправду не коррелируют?

издеваешься?

Страницы: 12

Предыдущая тема: Помощь по СИ


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.