Сохранен 58
https://2ch.hk/pr/res/351243.html
Прошлые домены не функционирует! Используйте адрес ARHIVACH.VC.
24 декабря 2023 г. Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!
Аноним Срд 07 Май 2014 02:43:05  #1 №351243 
1399416185761.png

Сап, /pr
Я решил прочитать исходники дума, для того, чтобы глубже окунуться в то, как писали код 20 лет назад, и многие моменты вызывают мои вопросы
Вот, например, простейшая генерация случайного числа:
Полная версия на пастбине: http://pastebin.com/RkCaRSbQ

unsigned char rndtable[256] = {

0, 8, 109, 220, 222, 241, 149, ... 249

};

int prndindex = 0;

int P_Random (void)

{
prndindex = (prndindex+1)&0xff;

return rndtable[prndindex];
}

Неужели в Си не было генератора случайных чисел? Зачем они написали свой?
Почему в массиве числа раскиданы не по порядку? Ведь он всё равно фиксированный, почему нельзя было просто их перечислить?
К своему глубочайшему стыду, я нихуя не знаю, что будет в prndindex после
prndindex = (prndindex+1)&0xff;
Но тем не менее, зачем такие сложности?
Ведь можно просто взять последние три цифры текущего времени

Аноним Срд 07 Май 2014 02:56:18  #2 №351247 

>>351243
Так, падажжи ебана, это получается они тупо проходили по таблице с случайными числами? Ебануться. Хотя это я сейчас умный с интернетами и гуглом с алгоритмами случайных чисел, а ребята танцевали как умели.
>К своему глубочайшему стыду, я нихуя не знаю, что будет в prndindex после prndindex = (prndindex+1)&0xff;
Увеличить на единицу и оставить восемь младших бит, чтобы не выйти за пределы массива.

Есть еще что-то интересное?

Аноним Срд 07 Май 2014 03:12:06  #3 №351251 

>>351247
Ну да, просто проходили по таблице, причём она задана заранее

>оставить восемь младших бит
да, спасибо. На СО так же говорят
http://stackoverflow.com/questions/6126439/what-does-0xff-do

>Есть еще что-то интересное?
Сырцы сюда положил, читаю
http://rghost.ru/54998807

sageАноним Срд 07 Май 2014 03:19:21  #4 №351254 

>>351251
>Сырцы сюда положил
Но зачем?
https://github.com/id-Software/DOOM

Аноним Срд 07 Май 2014 03:31:28  #5 №351255 

>>351254
не помнил, откуда взял
спасибо за ссылку

В D_DoomMain (void) идет разбор параметров (аргументов), с которыми могла быть запущена игра (-nomonsters, -deathmatch итд)
Один из параметров - запуск игры с CD, судя по всему
Интересно, как такое работало на Linux

if (M_CheckParm("-cdrom"))
{
printf(D_CDROM);
mkdir("c:\\doomdata",0);
strcpy (basedefault,"c:/doomdata/default.cfg");
}

Аноним Срд 07 Май 2014 03:42:35  #6 №351256 

>>351255
Создастся директория "c:\\doomdata" в home, только что проверил. Правда, получить доступ к ней можно лишь с экранированием.

Аноним Срд 07 Май 2014 03:43:17  #7 №351257 
1399419797181.jpg

Весь сюжет игры содержится в d_engilsh.h
Весь сюжет игры на французском - в d_french.h
Блджад, это охуенно

#define C4TEXT "LE VISAGE HORRIBLE D'UN DEMON D'UNE\n"\
"TAILLE INCROYABLE S'EFFONDRE DEVANT\n"\
"VOUS LORSQUE VOUS TIREZ UNE SALVE DE\n"\
"ROQUETTES DANS SON CERVEAU. LE MONSTRE\n"\
"SE RATATINE, SES MEMBRES DECHIQUETES\n"\
"SE REPANDANT SUR DES CENTAINES DE\n"\
"KILOMETRES A LA SURFACE DE L'ENFER.\n"\
"\n"\
"VOUS AVEZ REUSSI. L'INVASION N'AURA.\n"\
"PAS LIEU. LA TERRE EST SAUVEE. L'ENFER\n"\
"EST ANEANTI. EN VOUS DEMANDANT OU IRONT\n"\
"MAINTENANT LES DAMNES, VOUS ESSUYEZ\n"\
"VOTRE FRONT COUVERT DE SUEUR ET REPARTEZ\n"\
"VERS LA TERRE. SA RECONSTRUCTION SERA\n"\
"BEAUCOUP PLUS DROLE QUE SA DESTRUCTION.\n"

Аноним Срд 07 Май 2014 03:45:58  #8 №351259 

>>351256
Как я понял, чему-то с диска нужна эта директория и конфиг, лежащий в ней.
На диске тогда вроде только музыка лежала
Мне просто показалось, что это достаточно костыльно для id Software

Аноним Втр 20 Май 2014 03:22:15  #9 №354412 

ВТОРОЙ БМАП
ОП, доложи о результатах исследования.

Аноним Втр 20 Май 2014 05:19:26  #10 №354418 
1400548766853.jpg

>>351257
Забавно, что 29-й уровень, про который ты закопипастил, называется The Living End - как мой любимый gay movie. "Ты приклеишься к стулу", - гласит постер.

Аноним Втр 20 Май 2014 05:46:11  #11 №354420 

>>351243
> Ведь можно просто взять последние три цифры текущего времени
И что опрашивать системный таймер каждый раз когда нужно? Упоротый? Проще через опр колл раз узнать что игрок нажмёт, в право или в лево. Там кстати не так? И счётчика тактов тогда ещё не было.

Аноним Втр 20 Май 2014 07:08:21  #12 №354422 

>>354420
Мамкин ынтерпрайз-программист смеется над вашими проблемами оптимизации.

Аноним Втр 20 Май 2014 16:46:17  #13 №354534 

>>351243

> Ведь можно просто взять последние три цифры текущего времени

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

Аноним Срд 21 Май 2014 12:41:41  #14 №354870 

ОП, доложи о результатах исследования.

Аноним Срд 21 Май 2014 19:30:59  #15 №354949 
1400686259765.jpg

>>351243
Олдфаг в треде. Не все понимают, что такое Doom. Там было все адски оптимизированно. Это была РЕВОЛЮЦИОННАЯ по графону игра, которая игралась на 80386 c 30MHz, без сопроцессора и и без платы видеокарты. Парни из idSoftware раскрыли целиком потенциал i386. Конкуренты запилят сравнимое только года через 3, когда id выпустит свой слепящий вин Quake.
> Неужели в Си не было генератора случайных чисел?
Нет. Все разрабы компиляторов делали его как бог на душу положит. И типичный генератор, как правило, был медленный. Требовал умножения и пару сдвигов.
> Почему в массиве числа раскиданы не по порядку?
Ты не понимаешь, что такое случайная последовательность?
> Ведь можно просто взять последние три цифры текущего времени
Таймера, с которого можно было быстро взять число, тогда в компьютеры не клали. У всех типов IBM PC был только системный, который тикал 19 раз в секунду и был бесполезен для генерации рандома.

Аноним Срд 21 Май 2014 19:46:16  #16 №354954 

>>354949
А почему нельзя было на диск класть соль или часть последоательности?
В варианте, процитированном ОП-ом, у нас с каждым запуском повторяется последовательность - нехорошо как-то.
Я бы брал соль из файлика, тратил немножко времени во время загрузки на генераццию этого массива, а потом делал как они. Или с этим могут быть какие-то проблемы?

Аноним Срд 21 Май 2014 20:25:50  #17 №354958 

>>354954
>тратил немножко времени во время загрузки на генераццию этого массива,
Как бы ты его генерил рандомный массив без рандома то?

Аноним Срд 21 Май 2014 21:11:34  #18 №354970 

А это что, единственное интересное место в думе?

Аноним Срд 21 Май 2014 21:15:54  #19 №354971 

Остальное для ОПа слишком сложно :) А тут он придумал патч для дума...

Аноним Срд 21 Май 2014 21:18:46  #20 №354972 

>>354970
Ну, Кармак еще вроде говорил что while для пидаров и НИНУЖНО, но в исходниках по ссылкам он есть.

Тесты C# онлайн Аноним Срд 21 Май 2014 21:58:46  #21 №354978 
1400695126602.jpg

Есть такой сайт http://sql-ex.ru/ тут можно проходить тесты по SQL онлайн, выполнять задания, получать баллы итд. Есть аналог по C# ?

Тесты C# онлайн Аноним Срд 21 Май 2014 21:59:56  #22 №354979 

>>354978
Блять промазал

Аноним Срд 21 Май 2014 22:18:16  #23 №354984 

>>354978
https://www.codehunt.com/

Аноним Срд 21 Май 2014 22:45:04  #24 №354991 
1400697904643.jpg

>>351243
>три цифры текущего времени
Нахуя? Пусть лучше делает ролл на дваче и берет последние три цифры номера поста.

А теперь подумай, насколько рандомные будут у тебя числа, если потребуется запросить сразу несколько подряд чисел в один момент времени. Подсказка: таймер имеет очень низкое разрешение, так что ты получиишь просто несколько одинаковых чисел.

А вообще такая хуита может быть задумана для быстрого получения случайных чисел, т.к. в то время быстрее было прочитать значение из памяти тогда даже кеш не везде стоял, ибо память имела относительно низкие задержки, чем считать какое-то там выражение. Это не криптография, сойдет и так.

sageАноним Срд 21 Май 2014 22:56:19  #25 №354995 
1400698579890.gif

>Пусть лучше делает ролл на дваче
У нас побелитель!

Аноним Срд 21 Май 2014 23:00:51  #26 №354997 

>>354991
Ах да, также стоит обратить внимание на котекст. Может он откуда-то вызывается, где так и надо.

sageАноним Чтв 22 Май 2014 00:07:48  #27 №355032 
1400702868171.jpg

Этот тред разочаровывает меня.
Так что теперь это АРХИВАТОРЫ ДЛЯ СВЕРХ-МАЛЕНЬКИХ ДАННЫХ-ТРЕД.
Обсуждаем эффективные по степени сжатия алгоритмы сжатия для данных размеров около 100 байт. Старые, забытые всеми, cравнение с современными deflate, lzo, snappy. Сейчас не могу вспомнить, слышал, что был какой-то легендарный компрессор от русскоязычного разработчика по-моему для спектрума, который правда был ориентирован на большие объемы в районе 1 Кб, но справлялся наудивление хорошо.

Аноним Чтв 22 Май 2014 00:13:45  #28 №355034 

Исходники не смотрел, но есть подозрение, что это сделано специально для повторяемости псевдослучайной последовательности при проигрывании демок или сетевой игре, где ход игры от них зависит.

Аноним Чтв 22 Май 2014 02:52:47  #29 №355056 

>>355034
Но это можно организовать и без LUT. Практически все ГПСЧ имеют seed.

Аноним Чтв 22 Май 2014 03:58:25  #30 №355058 

>>351243
>Неужели в Си не было генератора случайных чисел?
Нормальный, вменяемый генератор псевдослучайных чисел пишется на коленке за несколько часов несколько минут.
Алгоритм прост до безобразия:

number = 1234567890
random = number * константное_простое_чило_1 % константное_простое_число_2
number = random
return random

Простые числа при этом должны быть по возможности далеки от степеней двойки. Первое простое число должно быть достаточно маленьким . Второе простое число должно быть достаточно большим. Чем оно больше, тем больше множество случайных чисел, которые могут быть сгенерированы.

Аноним Чтв 22 Май 2014 04:21:34  #31 №355061 

>>354534
>таймер тикал в несколько тысяч раз медленнее чем процессор
Вот ты тупой, лол. Зачем тогда этот таймер нужен?
Как тогда отделять единички от нулей, если не с помощью тиков?

Аноним Чтв 22 Май 2014 04:44:57  #32 №355064 

>>355058
Это дерьмо даже не потокобезопасно.

Аноним Чтв 22 Май 2014 04:47:10  #33 №355065 
1400719630200.jpg

>>355061>>355064
Уже невозможно толще.

Аноним Чтв 22 Май 2014 05:04:49  #34 №355069 

>>354972
> говорил что while НИНУЖНО
Подгони пруф.Но так то да

Аноним Чтв 22 Май 2014 05:09:33  #35 №355070 

>>355069
Да хуй там что он тебе подгонит. Он даже сорцы дума не читал. Нашел рандом и теперь будет о нем говорить вечно.

Аноним Чтв 22 Май 2014 05:29:36  #36 №355074 

>>355065
Что тебе толсто, петух обоссанный? За вот это стейтфул говно >>355058 в приличных местах ссут на ебало.

sageАноним Чтв 22 Май 2014 07:27:38  #37 №355078 

>>355074
>var=val
>стейтфул
>ссут на ебало
Судишь по своему опыту?

Аноним Чтв 22 Май 2014 08:05:57  #38 №355081 

>>355058
Во-первых, у тебя тут умножение, во-вторых, остаток от деления, в-третьих три присвоения, вместо одного.

Аноним Чтв 22 Май 2014 08:29:48  #39 №355083 

>>355081
>у тебя
Чини детектор.
>умножение, остаток, присвоения
Блядь, и что? Причем тут потокобезопасность. Это во-первых. Во-вторых делать рэндом потокобезопасным просто тупо. Он в сферическом приложении создается внутри одного класса или даже метода. В первом случае, если класс задумывается как потокобезопасный, на него и ложится ответственность за эту безопасность. В остальных случаях это оверхед. Посчитай. У тебя в проге 3 потока, но 100500 объектов. Притом, что несколькими потоками используются <1% объектов с учетом вложенности (не считая stateless). Остальные действительно нужно делать потокобезопасными?
И что уж касается stateful. Да где ты вообще видел stateless-рэндом? Если в языке без ООП еще понятно, то если ООП есть, это всё равно что при наличии лопаты копать землю палкой. Я даже не могу придумать случая, когда рэндом нужен одновременно в двух потоках. Даже так, он по логике всё равно будет включен в какой-то другой класс.
И что самое главное!
Человек писал про алгоритм получения случайного числа на основе seed'а, а не структуру программы, и показал это естественно на псевдокоде. Каким же надо быть уебаном, чтобы придраться к структуре, которой в этом псевдокоде нет. Там просто написано, что значение random принимается, как следующий seed и как возвращаемое значение. Stateful-неStateful - это всё твоя больная фантазия, пост был не об этом.

Аноним Чтв 22 Май 2014 09:27:02  #40 №355090 

>>355083
Таблетки принял?

Аноним Чтв 22 Май 2014 09:59:12  #41 №355093 

>>355090
НЕТ!

Аноним Чтв 22 Май 2014 11:02:25  #42 №355104 

>>355034
>это сделано специально для повторяемости псевдослучайной последовательности при проигрывании демок
Двачую

>>355056
Если использовать ГСПЧ от компилятора, получаем что траектория движения мостров будет зависеть от того, чем дум компилировали (точнее от реализации ГСПЧ). В итоге при перекомпиляции можем получить невалидные демки.

Аноним Чтв 22 Май 2014 11:14:23  #43 №355106 

>>355104
Ебать, а не правильнее будет в демках хранить движения монстров? Террабайты данных?

Аноним Чтв 22 Май 2014 11:14:54  #44 №355108 

>>355104
> Если использовать ГСПЧ от компилятора, получаем что траектория движения мостров будет зависеть от того, чем дум компилировали (точнее от реализации ГСПЧ). В итоге при перекомпиляции можем получить невалидные демки.

Поэтому в игорах и используют свои генераторы вместо rand() из libc. Вот зачем используют таблицу? Есть подозрение, что Кармак в 23 года тогда попросту не знал, как писать генераторы. Хотя это тоже странно, было полно libc с исходниками.

Аноним Чтв 22 Май 2014 11:17:31  #45 №355109 
1400743051768.jpg

Я вижу в этом ITT-треде какой-то подвох.

Аноним Чтв 22 Май 2014 11:19:28  #46 №355110 

>>355106
Нет. В демках, как правило, записываются только команды ввода от игрока, которые при проигрывании демок отсылаются от псевдо-клиента на игровой сервер. Вернее, хранится дельта для соседних команд. Это связано с тем, что возможность писать демки - следствие из наличия сетевой игры, для которой минимизируют размер передаваемых данных.

Аноним Чтв 22 Май 2014 13:43:32  #47 №355147 

>>355108
>>355081

Аноним Чтв 22 Май 2014 18:36:31  #48 №355250 

Пиздец, какие же дауны раньше были. Можно было хотя бы элементы кольца выводить. Вся суть уебков, не умеющих в математику.
https://ideone.com/so3yB4

Аноним Чтв 22 Май 2014 19:19:21  #49 №355262 

Криптуй, погромач.
https://ideone.com/z4ljPe
https://ideone.com/ozmFAA

Аноним Чтв 22 Май 2014 19:29:23  #50 №355264 

>>355262
>29 8 58 37 16 66 45 24 3 53 32 11 61 40 19 69 48 27 6 56 35 14 64 43 22 1 51
>30 9 59 38 17 67 46 25 4 54 33 12 62 41 20 70 49 28 7 57 36 15 65

Аноним Чтв 22 Май 2014 20:57:47  #51 №355290 
1400777867512.gif

>>351243
>Вот, например, простейшая генерация случайного числа
>Ведь можно просто взять последние три цифры текущего времени

Криптолог в треде, все в ФСБ

Аноним Чтв 22 Май 2014 21:15:37  #52 №355297 

>>351243
А ты знаешь, что в современных шейдерных языках(hlsl, например) тоже нет RND?

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

Аноним Чтв 22 Май 2014 21:44:22  #53 №355306 
1400780662397.png

>>355290
> исходники дума
> криптография

Аноним Чтв 22 Май 2014 22:51:27  #54 №355333 

>>355297
Не скажу за шейдеры, но в том же опен_кл легко можно навелосипедить неплохой рнг, ничем не хуже чем цпу-шные.
Соль, разумеется, снаружи.

Аноним Чтв 22 Май 2014 22:58:49  #55 №355339 

Я кстати однажды пробовал генерировать случайные числа при помощи системного времени в наносекундах в жабе.
В результате нихуя хорошего не получилось.
Три последние цифры наносекунд не обладают достаточной случайностью.
В результате последовательность случайных чисел получается очень хуевой. И работает это очень медленно.

Системное время годится только в качестве стартового значения для ГПСЧ, который работает очень даже хорошо и возвращает сотни милионов как бы случайных числе, перед тем как последовательность повторяется.

Впрочем одна из проблем ГПСЧ в том, что количество исходных seed-значений ограничено. Пусть последовательности и очень длинные, но seed довольно маленький, а это означает, что всего существует не так уж много разных последовательностей, которые можно сгенерировать.

Чем больше максимально возможный сид, тем больше существует последовательностей, которые можно сгенерировать.

Выражаясь математическим языком, идеальную во всех отношениях случайную последовательность можно получить при помощи ГСЧ только если использовать n-цифр в сиде, причем n стремится к бесконечности.

Впрочем не все так трагично как кажется, если использовать сиид размером всего в несколько киллобайт, то количество возможных случайных последовательностей становится довольно велико.

К сожеланию за раз такие числа посчитать не возможно.

Аноним Птн 23 Май 2014 03:00:20  #56 №355383 

>>355339
Это для каких целей тебе не хватает unix time? Что шифровать собрался?

Кстати, почему-то остался без внимания массивный гет — 1400000000, 13 мая 4:53:20.

Аноним Птн 23 Май 2014 07:26:26  #57 №355393 

>>355383
>проебали гет
Что ж ты молчал?
>>355339
>наносекунды в жабе
Умей читать.
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html#nanoTime()
This method provides nanosecond precision, but not necessarily nanosecond accuracy.

Аноним Птн 23 Май 2014 08:40:56  #58 №355397 

>>354954
> А почему нельзя было на диск класть соль или часть последоательности?
> Я бы брал соль из файлика,
Потомучто ты живешь в уютном мирке, где всегда были процессоры с гигагерцевыми частотами, где деление, умножение, сложение стоят 1 такт и чтение из файла - какие-то наносекунды. Ещё раз укажу на существенное: Doom работает на процессоре с тактовой частотой 30MHz

comments powered by Disqus