Page 1 of 1

говнокод

PostPosted: 14 Jan 2017, 15:46
by fk0
Почему 99% музыкальных плееров не умеют проиграть список в *случайном*, порядке? Ну т.е. функция там такая есть, но авторы, долбоёбы, не могли сделать одной из трёх вещей:

1) взять нормальный ГПСЧ таки, а не библиотечных rand(), дающий чёрти что (и проинициализировать его хоть текущим временем что ли);

2) взять числа от 1 до N, взять 2*N случайных чисел и переставить местами два числа в списке (по rand() номеру), брать числа по порядку из полученного списка и играть соответствующую числу композицию. А не играть, @#$%!, композицию по rand() номеру... который, @@#!$!!, ещё через rand()%N усекли (в мане, !@#$#!, написано, !@##$!, делить надо, а не остаток брать).

3) Взять пару взаимно простых чисел... Одно равное или большее N, второе -- любое меньшее N. Каждый раз к номеру композиции прибавлять второе (брать остаток от деления на первое). Гарантированно пробежит по всему списку, где случайность обеспечивается выбором первой композиции и выбором второго числа.

В итоге имеем список на 1000 пунктов и всегда по одному заведённому порядку играется только 20. До остальных никогда не доходит. AyEmul похоже тоже... :-(

Re: говнокод

PostPosted: 14 Jan 2017, 16:10
by lvd
Замечу, что случайно переставить список -- нетривиальная задача. А просто случайно играть -- будут повторы.

Re: говнокод

PostPosted: 14 Jan 2017, 16:37
by fk0
Да пусть повторяется. Проблема-то только в том, что некоторые повторяются _существенно_ _чаще_ других, а некоторые не играют вообще. Распределение не равномерное.

Re: говнокод

PostPosted: 15 Jan 2017, 20:25
by deathsoft
lvd wrote:Замечу, что случайно переставить список -- нетривиальная задача.

Задача тривиальнейшая, заводится массив чисел с размером как длина списка, каждый элемент массива также имеет ссылку на элемент списка, в этот массив генерируются случайные числа от 0 до N-1 (где N длина списка), далее сортируем этот массив и играем его подряд, все! Массив является индексом к списку.

Re: говнокод

PostPosted: 15 Jan 2017, 20:28
by deathsoft
fk0 wrote:Почему 99% музыкальных плееров не умеют проиграть список в *случайном*, порядке?

Потому что авторы плееров долбоебы видимо. ГПСЧ можно взять типа Mersen Twister, привести его в диапазон 0..N-1 делением (как положено, а не модулем), инициализировать таймером или через __rdtsc().

Re: говнокод

PostPosted: 16 Jan 2017, 13:37
by lvd
deathsoft wrote: в этот массив генерируются случайные числа от 0 до N-1 (где N длина списка), далее сортируем этот массив

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

Re: говнокод

PostPosted: 20 Jan 2017, 21:57
by deathsoft
lvd wrote:Так как никто не гарантировал, что случайные числа в нём не повторятся, то после сортировки будут много одинаковых чисел подряд, которые, в зависимости от алго сортирвоки, или останутся в том же порядке, что были, или переставятся алгоритмом как-то, отнюдь не случайно.

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