Ты как-то плохо прочитал тот мой пост "подгоревшего пукана" -- там есть и про НОК и про НОД. (Добавление)
Короче, если бы условия задачи были такими, что на вход нужно было подавать так: array('a' => 20, 'b' => 65) то да, вычислить размер ранжа можно было бы из суммы значений.
А так -- полная лажа.
в условии задачи ничего про случайность не сказано
Цитата:
следующие требования:
- при многократном вызове функции ключи массива должны возвращаться с пропорциями, указанными в значениях.
Цитата:
с пропорциями указанными в значениях
Цитата:
с пропорциями
Цитата:
указанными в значениях
Цитата:
a=>1/8, b=>1/2, при запуске функции большое количество раз, в 20% случаев должен вернуться ключ a, в остальных – b
Цитата:
в 20% случаев
Цитата:
случаев
(Добавление)
MiksIr пишет:
или случайная выдача с разной вероятностью или точная выдача в пропорциях
Автор вопроса сам не понял что ему надо -- вдоль или поперек.
Я расписал вариант который может сделать и вдоль и попререк (случайность в заданных пропорциях), но с условием, что сумма дробей поданных на вход должна быть равной еденице.
Иначе он на двух стульях не усидит.
ЧТо битрикс, что модикс -- помойки.
Бери небольшую цмс написанную на каком-либо серьезном фреймворке (ну или бери голый фв и пиши на нем цмс).
А серьезные фв писали далеко не идиоты, поэтому, ты хотябы будешь уверен, что там все будет продумано и документировано.
Вчера мне эта задача не давала покоя.
Ну, в каком смысле -- мне не нравится ни реализация ТС, ни постановка задачи.
За вчера я прикинул разных вариантов.
Пришел вот к чему:
1) При "приведении" дробей в десятичную систему исчисления, мы теряем точность.
И даже может случиться так, что при малом значении $precision диапазон ранжа элемента вообще не будет добавлен в таблицу.
Я мог бы реализовать и максимальную точность, но мне влом лопатить циклы для нахождения НОК и НОД (+ подробности в п.4).
2) Почему собираю индексы в массив?
Потому что необходимо "запоминать" состояние "случайной" генерации.
В таком виде будет достаточно сдвигать курсор в массиве.
А при достижении конца массива, шафлануть его еще раз, и гнать по кругу.
Еще:
Паноптик указал мне, что запиливать массив и двигать в нем курсор некошерно.
Предложил такой вариант:
Цитата:
ты берешь допустим сумму всех коэфициентов и делаешь рандом число
рандом число в пределах суммы
и к примеру для чисел 1/2 1/3 1/4 - сумма будет 12
делаешь ранд от 1 до 12
ретурн получается следующий
если ранд < 12*1/2 ретурн ключ 1/2
если ранд < 12*(1/2+1/3) ретуран 1/3
сумма не важно какая
это может быть хоть статическое число
1000 например
главное чтобы распределить эту 1000 на равные куски которые соответствуют сумме всех коэфициентов
то есть для чисел 1/2 1/3 1/4 это будет примерно соотношение 0,5+0,33+0,25 = 1,08
коеф1/2 = 0,5/1,08 ~ 46%
коеф1/3 = 0,33/1,08 ~ 30%
коеф1/4 = 0,25/1,08 ~ 23%
соотвественно если рандом число входит в промежуток от 0 до коеф1 - то результат 1
если от коеф1 до коеф2 - результат 2 и тд
Но ранд может надолго засесть, например, в коэффе 46% и выдать не корректное кол-во вариантов в заданном диапазоне.
Т.е. условие задачи будет нарушено.
3) Для конкретного примера можно подзабить на ресурсы.
В реальной же задаче можно было бы написать свой псевдослучайный алгоритм с обходом ранжа без повторов, который позволил бы не создавать этот монстрячий массив.
4) Даже для моего примера, если приводить к точным кол-вам попыток, то получается что сумма этих трех дробей больше еденицы.
Так же, неизвестно что делать и при сумме вариантов меньше еденицы.
Мне что, нуллы выдавать через раз, если например передано array('a' => '1/4', 'b' => '1/4')?
А если нуллы выдавать не положено, то, какие ж это нахрен 1/4 ?
Делаешь копию этого файла, и пусть она лежит на случай если что-то не получится.
Туперь удаляешь нахрен все из оригинального файла.
И вставляешь по кусочку обратно из сохраненного, возможно придется учитывать вложенность блоков.
Так ты точно определишь где проблема и что это за проблема.
Формошлёпка чтоли?
Завязывай и иди учить более подходящие языки и инструменты для реализации реалтайм гуевых приложений.
DeSur пишет:
можно ли заполнить таблицу с клавиатуры уже в процессе работы программы, а также чтобы была возможность изменять значения ячеек также уже в процессе работы программы