- 1
- 2
- 3
- 4
- 5
int getRandomNumber(){
int Number[1];
return Number[6];
}
//Я только учусь, поэтому не судите строго.
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+15
int getRandomNumber(){
int Number[1];
return Number[6];
}
//Я только учусь, поэтому не судите строго.
И кому теперь нужно srand(GetTickCount());
WGH 26.03.2014 19:50 # 0
bormand 26.03.2014 19:54 # +3
В с++ то? Никому. Юзай вменяемые boost::random (везде) и std::random (в с++11), а не дикое сочетание тормозного, неудобного и устаревшего говна srand() с виндоблядской апишкой GetTickCount().
Psionic 26.03.2014 19:56 # 0
bormand 26.03.2014 19:59 # +3
Во-первых - да. У него очень маленький seed и достаточно хреновое распределение. Впрочем как и у любого другого линейного конгруэнтного генератора.
Во-вторых он лагает как говно, если его юзать из нескольких тредов (производительность проседает где-то в 100(!) раз по сравнению с одним тредом). Ибо состояние глобальное.
В-третьих он тупо неудобен, т.к. нужное распределение из его выхлопа надо получать самому.
Psionic 26.03.2014 20:17 # 0
bormand 26.03.2014 20:22 # +1
То нужно юзать криптостойкий ГПСЧ, который прилагается ко всем приличным криптобиблиотекам. Этому требованию не удовлетворяет ни один генератор из boost::random/std::random (ну кроме random_device, но у него свои заморочки), что уж говорить о rand().
С 32 битным сидом rand()'а достаточно перебрать всего 4 миллиарда вариантов, и ты получишь все пароли и все ключи, которые могла сгенерить система ;) А если его еще и сдуру проинициализировали временем... Да еще и делали это на каждом запросе... Брр... Не дай бог приснится такое, носками не отмашешься.
laMer007 26.03.2014 20:27 # 0
А что там за заморочки?
bormand 26.03.2014 20:29 # +1
Abbath 26.03.2014 22:30 # 0
Soul_re@ver 26.03.2014 22:58 # 0
guest 26.03.2014 23:22 # +4
...,протрояненный анб
Lure Of Chaos 26.03.2014 23:50 # +2
задолго до "откровений" Сноудена я читал, что все устройства и алгоритмы были ОБЯЗАНЫ содержать бэкдор или ослабленный алгоритм для доступа силовых структур "на случай чего", иначе бы они не прошли одобрямс (сертификация, патент, разрешение - или как это грамотно называется)
в свое время был скандал с PGP, мол, этот алгоритм слишком секюрный, и его существенно ослабили перед доведением до общественности.
просто тогда никто не придавал этому никакого значения
а я и сейчас не придаю, на фоне общей истерии, потому как уже поздно что-либо скрывать, все уже утекло и в фсб и в фбр, и гуглам всяким
guest 27.03.2014 20:03 # +2
bormand 27.03.2014 05:40 # 0
Эт еще хуйня. Про intel management engine читал? Большой брат уже в твоем чипсете ;)
chtulhu 27.03.2014 07:08 # 0
bormand 27.03.2014 07:27 # 0
> хоста для виртуальных машин
Вполне достаточно SMM, который и bios и uefi вроде как всегда юзают (якобы для управления энергосбережением и прочей ерундой, но мы то знаем...).
bormand 27.03.2014 07:45 # 0
laMer007 27.03.2014 18:43 # 0
bormand 27.03.2014 19:30 # 0
А я о чем выше?
Биосы то можно исследовать. А вот ME, насколько показали поиски в гугле, является конфиденициальной инфой, и его так никто и не смог разломать и даже разобрать его прошивку (впрочем это хорошо, не хватало еще вирусов на этом сопроцессоре).
guest 27.03.2014 20:09 # 0
bormand 27.03.2014 05:43 # 0
/dev/urandom по дефолту. Но можно поменять.
wvxvw 26.03.2014 23:56 # 0
laMer007 26.03.2014 20:29 # 0
Wat?
rand в студии использует tls
bormand 26.03.2014 20:31 # +1
Очень весело будет, если кто-то проинициализирует seed в main'е, и наивно будет думать, что и в других тредах тоже все будет норм. А на деле они тупо начнут с единички...
Кстати, об этом написано в документации? Можно пруф?
laMer007 26.03.2014 20:55 # 0
Не знаю что там в пруфах, но у меня в прерываниях rand не работал. Падало при попытке чтения tls. Если не ошибусь то как раз при чтении FS:[0].
bormand 26.03.2014 20:58 # 0
Блин, а в виндовых драйверах разве можно юзать rand()?
laMer007 26.03.2014 21:08 # +1
Не, не виндовый. Есть некие наркомы, что заюзали для своей оси кресты со студией. Не будем о грустном.
laMer007 27.03.2014 18:45 # +1
bormand 26.03.2014 20:37 # +2
P.S. Насчет скорости - тестил на gcc под линухом. Там сид не в TLS, поэтому лагает как говно.
3.14159265 26.03.2014 20:41 # +6
Зато название говорящее.
По имени функции должно быть ясно что внутри, а именно - срандь.
Abbath 26.03.2014 22:27 # 0
это ты выяснил когда мой говнокод проверял?
bormand 27.03.2014 05:39 # 0
Dummy00001 27.03.2014 01:06 # 0
bormand 27.03.2014 05:48 # +3
1) Посикс-онли.
2) Тож самое линейно-конгруэнтное говно, что и rand(). Просто бит побольше.
3) Надпись в мане гласит: These functions are declared obsolete by SVID 3, which states that rand(3) should be used instead.
Dummy00001 27.03.2014 14:16 # 0
SVID 3 == "Version 3, based on System V Release 4, published 1989"
в посиксе о обсолишн ничего не написано:
http://pubs.opengroup.org/onlinepubs/9699919799/functions/drand48.html
в манах ванила SVR4 (ака солярка) тоже ничего такого не говорится:
http://www.freebsd.org/cgi/man.cgi?query=drand48&apropos=0&sektion= 0&manpath=SunOS+5.10&arch=default&format =html
roman-kashitsyn 26.03.2014 19:59 # +3
Xom94ok 26.03.2014 20:14 # +2
bormand 26.03.2014 20:17 # +3
Lure Of Chaos 26.03.2014 20:34 # +2
laMer007 26.03.2014 20:26 # +3
Now you have 2.000001 problems.
laMer007 26.03.2014 20:48 # 0
А что если написать как ниже для получения нормального распределения [0..99]? Видите проблемы кроме говнокода?
bormand 26.03.2014 20:55 # +2
Равномерного. Нормальное совсем не так выглядит.
> Видите проблемы
Вижу. Распределение не равномерное ;)
Пруф для сомневающихся: http://ideone.com/GnSkao
P.S. Да еще и плавучка юзается, походу этот код будет работать медленнее uniform_distribution.
laMer007 26.03.2014 21:03 # 0
http://ideone.com/wz0bcx
Если что код на 6:49
PS: Насчет перевода uniform - описка.
bormand 26.03.2014 21:10 # +1
Кто-то доигрался с экономией скобок ;)
http://ideone.com/NikpHq
myaut 27.03.2014 13:32 # 0
Так что распределение по ссылке - равномерное (считать лень).
bormand 27.03.2014 14:00 # +1
> Так что распределение по ссылке - равномерное
Ну тогда надо писать критерий и доверительный интервал :)
myaut 27.03.2014 14:32 # +1
Дык тест chi-square это и позволяет делать
> Преобразование, используемое в коде по ссылке портит вероятности - часть чисел на выхлопе вероятнее, чем остальные.
Не совсем. Часть чисел выпали чаще чем остальные, но это также может объясняться и недостаточностью выборки. Если вам выпало 10 раз подряд 6-6 это же не делает вас супервезучим игроком в Нарды, ведь так ;)
bormand 27.03.2014 15:01 # +2
Было 32768 равновероятных исходов. 32700 из них равномерно размазали по сотне выходов. Но остались 68 лишних. И они ВСЕГДА будут падать в одни и те же выходы (т.к. алгоритм такой). Это именно систематическая ошибка, а не случайная.
Soul_re@ver 26.03.2014 21:08 # +1
bormand 26.03.2014 21:13 # +1
Возможно. И даже реализовано в бустовском распределении ;)
Один из способов (который там и юзается) - тупо отбрасывать числа >= floor(|X| / |Y|) * |Y| и брать следующее случайное число. Тогда распределение на выходе будет равномерным.
laMer007 26.03.2014 21:23 # 0
bormand 26.03.2014 21:26 # 0
Если у генератора равномерное распределение - не уйдет.
laMer007 26.03.2014 21:51 # 0
Soul_re@ver 26.03.2014 21:27 # +2
Против математики не попрёшь :)
laMer007 26.03.2014 21:13 # 0
bormand 26.03.2014 21:23 # +1
У 32 чисел вероятность 0.00997, а у остальных 0.01001
laMer007 26.03.2014 21:24 # 0
bormand 26.03.2014 21:30 # +4
Из-за этого, например, 0 выпадает чаще чем 2. Это, конечно, копейки. Но вот для всяких научных расчетов, лотерей и тому подобного - это совершенно неприемлимо.