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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Равномерная пропорция.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
jonston
Отправлено: 10 Января, 2018 - 18:26:17
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




Всем добра!Как случайным образом определить равномерную пропорцию между N сегментами.Например 4 сегмента случайная пропорция = [0.27, 0.33, 0.21, 0.19].То есть сумма всех сегментов равна 1.Условие что бы пропорция была равномерная.

(Отредактировано автором: 10 Января, 2018 - 18:42:25)



-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
Строитель Модератор
Отправлено: 10 Января, 2018 - 18:33:50
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




jonston, у вас ведь сумма значений в массиве не равна единице ... Или я не правильно понял?
 
 Top
jonston
Отправлено: 10 Января, 2018 - 18:42:53
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




Строитель пишет:
jonston, у вас ведь сумма значений в массиве не равна единице ... Или я не правильно понял?

Извиняюсь, поправил.


-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
Строитель Модератор
Отправлено: 10 Января, 2018 - 19:01:10
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




jonston, вероятно так?
Спойлер (Отобразить)
 
 Top
jonston
Отправлено: 10 Января, 2018 - 19:22:54
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




Строитель пишет:
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.  

(Отредактировано автором: 10 Января, 2018 - 19:25:33)



-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
Строитель Модератор
Отправлено: 10 Января, 2018 - 19:28:04
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




jonston, можно как-то так
Спойлер (Отобразить)
Но тут ещё нужно (если нужно) добавить некую проверку на отрицательные значения в массиве.
(Добавление)
jonston пишет:
В вашем примере вы не даете возможность части быть выше 1/3
А для этого можно в цикле записать так :
PHP:
скопировать код в буфер обмена
  1. $array[] = mt_rand(1, (100 - $count)) / 100;

P.S.: Сейчас подправлю свой ответ.
 
 Top
jonston
Отправлено: 10 Января, 2018 - 19:51:13
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




Ваш алгоритм не правильно работает.


-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
Строитель Модератор
Отправлено: 10 Января, 2018 - 19:52:51
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




jonston, тогда подождите, может кто-то ещё подскажет.
 
 Top
Sail
Отправлено: 10 Января, 2018 - 20:56:44
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




jonston, напомните, пожалуйста, что есть "равномерная" пропорция?
Помню про геометрическую, арифметическую, гармоническую... а вот равномерная?
Из первого сообщения понятно, что "случайная" - это просто N случайных величин, сумма которых === 1, чего не сказать о "равномерной" (и примера для ясности нет...)
Закатив глазки
 
 Top
jonston
Отправлено: 11 Января, 2018 - 12:37:28
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




Sail пишет:
jonston, напомните, пожалуйста, что есть "равномерная" пропорция?
Помню про геометрическую, арифметическую, гармоническую... а вот равномерная?
Из первого сообщения понятно, что "случайная" - это просто N случайных величин, сумма которых === 1, чего не сказать о "равномерной" (и примера для ясности нет...)
Закатив глазки

Подразумеваю то, что для каждой части есть равный шанс получить тот или иной процент.


-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
Строитель Модератор
Отправлено: 11 Января, 2018 - 13:16:59
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




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

Ну или я не правильно понимаю вашу задачу
Спойлер (Отобразить)
 
 Top
jonston
Отправлено: 11 Января, 2018 - 17:36:42
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




Строитель пишет:
А как тогда все эти части "вместить" в единицу? К примеру, 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. Повторяем операцию до нужного количества частей.

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


-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
Строитель Модератор
Отправлено: 11 Января, 2018 - 17:41:08
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




jonston пишет:
1. Берем рандом от 0 до 1.Получается скажем 0.7
А если получаем 0.8 ? Или 0.9 ? Последний мой пример из предыдущего поста тоже не подходит?
 
 Top
jonston
Отправлено: 11 Января, 2018 - 19:31:57
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




Строитель пишет:
jonston пишет:
1. Берем рандом от 0 до 1.Получается скажем 0.7
А если получаем 0.8 ? Или 0.9 ? Последний мой пример из предыдущего поста тоже не подходит?


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


-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB