Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Равномерная пропорция.
Форумы портала PHP.SU » » Вопросы новичков » Равномерная пропорция.

Страниц (1): [1]
 

1. jonston - 10 Января, 2018 - 18:26:17 - перейти к сообщению
Всем добра!Как случайным образом определить равномерную пропорцию между N сегментами.Например 4 сегмента случайная пропорция = [0.27, 0.33, 0.21, 0.19].То есть сумма всех сегментов равна 1.Условие что бы пропорция была равномерная.
2. Строитель - 10 Января, 2018 - 18:33:50 - перейти к сообщению
jonston, у вас ведь сумма значений в массиве не равна единице ... Или я не правильно понял?
3. jonston - 10 Января, 2018 - 18:42:53 - перейти к сообщению
Строитель пишет:
jonston, у вас ведь сумма значений в массиве не равна единице ... Или я не правильно понял?

Извиняюсь, поправил.
4. Строитель - 10 Января, 2018 - 19:01:10 - перейти к сообщению
jonston, вероятно так?
Спойлер (Отобразить)
5. jonston - 10 Января, 2018 - 19:22:54 - перейти к сообщению
Строитель пишет:
jonston, вероятно так?

Наверное я не правильно выразился.В вашем примере вы не даете возможность части быть выше 1/3.
Вот мой вариант.Выношу на суд критики.
PHP:
скопировать код в буфер обмена
  1.  
  2. $segments = [];
  3. $length = 5;
  4. $start = 1000;
  5. $rest = $start;
  6.  
  7. for($i = 0; $i < $length; $i++){
  8.     $rand = ($i < $length - 1) ?  mt_rand(0, $rest) : $rest;
  9.     $rest -= $rand;
  10.     $segments[$i] = $rand/$start;
  11. }
  12. shuffle($segments);
  13. print_r(array_sum($segments));
  14.  
6. Строитель - 10 Января, 2018 - 19:28:04 - перейти к сообщению
jonston, можно как-то так
Спойлер (Отобразить)
Но тут ещё нужно (если нужно) добавить некую проверку на отрицательные значения в массиве.
(Добавление)
jonston пишет:
В вашем примере вы не даете возможность части быть выше 1/3
А для этого можно в цикле записать так :
PHP:
скопировать код в буфер обмена
  1. $array[] = mt_rand(1, (100 - $count)) / 100;

P.S.: Сейчас подправлю свой ответ.
7. jonston - 10 Января, 2018 - 19:51:13 - перейти к сообщению
Ваш алгоритм не правильно работает.
8. Строитель - 10 Января, 2018 - 19:52:51 - перейти к сообщению
jonston, тогда подождите, может кто-то ещё подскажет.
9. Sail - 10 Января, 2018 - 20:56:44 - перейти к сообщению
jonston, напомните, пожалуйста, что есть "равномерная" пропорция?
Помню про геометрическую, арифметическую, гармоническую... а вот равномерная?
Из первого сообщения понятно, что "случайная" - это просто N случайных величин, сумма которых === 1, чего не сказать о "равномерной" (и примера для ясности нет...)
Закатив глазки
10. jonston - 11 Января, 2018 - 12:37:28 - перейти к сообщению
Sail пишет:
jonston, напомните, пожалуйста, что есть "равномерная" пропорция?
Помню про геометрическую, арифметическую, гармоническую... а вот равномерная?
Из первого сообщения понятно, что "случайная" - это просто N случайных величин, сумма которых === 1, чего не сказать о "равномерной" (и примера для ясности нет...)
Закатив глазки

Подразумеваю то, что для каждой части есть равный шанс получить тот или иной процент.
11. Строитель - 11 Января, 2018 - 13:16:59 - перейти к сообщению
jonston пишет:
Подразумеваю то, что для каждой части есть равный шанс получить тот или иной процент.
А как тогда все эти части "вместить" в единицу? К примеру, 1 / 4 = 0.25; Если одна из случайно сгенерированных четырех четвертей получит значение 0.98, то для второй четверти подойдёт 0.01 или 0.02. А вот для четвёртой (последней) четверти значения закончились, т.к. диапазон 1 исчерпан.

Ну или я не правильно понимаю вашу задачу
Спойлер (Отобразить)
12. jonston - 11 Января, 2018 - 17:36:42 - перейти к сообщению
Строитель пишет:
А как тогда все эти части "вместить" в единицу? К примеру, 1 / 4 = 0.25; Если одна из случайно сгенерированных четырех четвертей получит значение 0.98, то для второй четверти подойдёт 0.01 или 0.02. А вот для четвёртой (последней) четверти значения закончились, т.к. диапазон 1 исчерпан.


Вот опишу не правильный алгоритм.Вернее он правильный но не совсем.
1. Берем рандом от 0 до 1.Получается скажем 0.7.Остаток 0.3.
2. От остатка берем еще рандом от 0 до 0.3.Получается скажем 0.1.
3. Повторяем операцию до нужного количества частей.

При таком алгоритме у предыдущей части шанс быть больше последующей больше.
То есть насколько я понимаю, нужно после всех операций перемешать массив, что бы не разброс был равномерным.Ну это я так думаю.
13. Строитель - 11 Января, 2018 - 17:41:08 - перейти к сообщению
jonston пишет:
1. Берем рандом от 0 до 1.Получается скажем 0.7
А если получаем 0.8 ? Или 0.9 ? Последний мой пример из предыдущего поста тоже не подходит?
14. jonston - 11 Января, 2018 - 19:31:57 - перейти к сообщению
Строитель пишет:
jonston пишет:
1. Берем рандом от 0 до 1.Получается скажем 0.7
А если получаем 0.8 ? Или 0.9 ? Последний мой пример из предыдущего поста тоже не подходит?


Спасибо за подсказку.Я уже нашел решение.

 

Powered by ExBB FM 1.0 RC1