Разделить 100% на 4 случайных числа
1.
KOZZ (18.05.2012 / 21:29)
Залип я в эту, казалось бы, элементарную задачку.
Суть: есть 100%. нужно их случайным образом раскидать на 4 числа.
например 26, 14, 50, 10.
Как это сделать? Мой не спящий по ночам мозг не вывозит!
2.
ктулху (18.05.2012 / 21:40)
дык... рандомом генерим первое, вычитаем его из сотни.
генерим второе (например от 10 до 100), так же вычитаем, и так сколько нужно.
думаю логика должна быть такая, последнее число "генерится" само, всё что осталось от сотни.
3.
Максим (18.05.2012 / 21:40)
*deleted*
не увидел название раздела
4.
‮PLATINUM (18.05.2012 / 21:42)
Какие проценты? Если б число, я понимаю
Добавлено через 02:43 сек.
Вот если как шифт говорит, то это можно. Хотя всё равно муть получится
5.
KOZZ (18.05.2012 / 21:55)
5, нужно сделать помощь зала для игры миллионер.
Добавлено через 00:57 сек.
2.
ShiftBHT, сделал как ты посоветовал:
<?
$var = array();
$var[1] = 100 - rand(1,25);
$var[2] = 100 - $var[1] - rand(1,25);
$var[3] = 100 - $var[1] - $var[2] - rand(1,25);
$var[4] = 100 - ($var[1]+$var[2]+$var[3]);
echo $var[1].' + '.$var[2].' + '.$var[3].' + '.$var[4].' = '. array_sum($var);
?>
все бы ничего, да только отрицательные числа периодически получаются.
6.
Павел (18.05.2012 / 21:57)
диапазон есть у каждого числа? ну т.е может быть такое к примеру 97,1,1,1? больше интересует максимальное значение
7.
‮PLATINUM (18.05.2012 / 22:07)
<?php
$base = rand(500,1500);//чтоб были большие числа
$all = $base/(rand(1,100)/100);
$percent = 100 - rand(1,95);
$percent2 = $percent - rand(1,$percent-2);
$percent3 = $percent2 - rand(1,$percent2-2);
$percent4 = 100 - $percent - $percent2 - $percent;
$first = $percent/100*$all;
$second = $percent2/100*$all;
$third = $percent3/100*$all;
$forth = $percent4/100*$all;
?>
поправил
8.
KOZZ (18.05.2012 / 22:14)
8.
platinum дамаль, 1743.31034483 + 118.862068966 + 99.0517241379 + -1624.44827586 = 336.775862069
это немножко не тот результат, которого я ожидал )))
9.
Дмитрий (18.05.2012 / 22:18)
$sum = 0:
do {
$sum = array_sum(rand(0,100),rand(0,100), rand(0,100), rand(0,100));
} while($sum != 100);
10.
Виталий (18.05.2012 / 22:21)
deleted
11.
Дмитрий (18.05.2012 / 22:28)
do {
$s = array(rand(0,100),rand (0,100),
rand(0,100), rand(0,100));
$sum = array_sum($s); } while
($sum != 100); print_r($s);
12.
Дмитрий (18.05.2012 / 22:44)
Велик от меня:
<?
function random_num($num) {
$arr = array();
for ($x = 0; $x < 4; $x++) {
if ($x < 3) {
$arr[] = rand(1, $num-array_sum($arr));
} else {
$arr[] = $num-array_sum($arr);
}
}
return $arr;
}
$s = random_num(1000);
echo array_sum($s) . '<br />';
var_dump($s);
/*
1000
array[4]
0 => "328"
1 => "162"
2 => "499"
3 => "11"
*/
13.
Петр (19.05.2012 / 07:50)
И от меня: $arr=array_rand(range(0, 33), 3); $arr[]=100-array_sum($arr);
14.
Виталий (19.05.2012 / 09:31)
мой велосипед:
<?php
$rand = array();
for ($i = 0; $i < 4; $i++) {$rand[] = mt_rand(0, 5);}
echo 'A:'.round(100 / array_sum($rand) * $rand[0]).'%<br />';
echo 'B:'.round(100 / array_sum($rand) * $rand[1]).'%<br />';
echo 'C:'.round(100 / array_sum($rand) * $rand[2]).'%<br />';
echo 'D:'.round(100 / array_sum($rand) * $rand[3]).'%<br />';
15.
KOZZ (19.05.2012 / 12:50)
нулевые и отрицательные значения не нужны, соотетственно 15 пост не катит
16.
Виталий (19.05.2012 / 13:22)
16.
eGo Works 2 Yourself, каким образом тут могут быть отрицательные значения? O_o от нулевых можешь спастись, если генерить от 1 и более) я не понимаю тебя тогда
Добавлено через 00:27 сек.
for ($i = 0; $i < 4; $i++) {$rand[] = mt_rand(1, 5);}
Добавлено через 00:49 сек.
делов то
17.
KOZZ (19.05.2012 / 13:31)
мне нужно разделить число 100 на 4 ненулевых и не отрицательных числа, в сумме дающих 100.
18.
Виталий (19.05.2012 / 13:38)
deleted
19.
Виталий (19.05.2012 / 14:00)
A:13%
B:21%
C:41%
D:25%
Всего:100
бывает результат что при округлении может в общем выйти 99 или 101, а так отрицательных и нулевых быть не может, если чуток поменять код преведенный в 15 посте - генерить, к примеру, от 10 до 1000, то нулевых значений в результате быть просто не может
20.
Дмитрий (19.05.2012 / 16:31)
18.
eGo Works 2 Yourself, чем тебя мой вариает не устраивает? Самый кошерный из представленных выше
21.
ramzes (19.05.2012 / 16:50)
<?
$s1 = mt_rand(1, 97);
$s2 = mt_rand(1, 98-$s1);
$s3 = mt_rand(1, 99-$s1-$s2);
$s4 = mt_rand(1, 100-$s1-$s2-$s3);
22.
Виталий (19.05.2012 / 19:34)
ramzes (19 Мая 2012 / 16:50)
<?
$s1 = mt_rand(1, 97);
$s2 = mt_rand(1, 98-$s1);
$s3 = mt_rand(1, 99-$s1-$s2);
$s4 = mt_rand(1, 100-$s1-$s2-$s3);
переменная s1 почти всегда будет содержать большее значение остальных
23.
ramzes (19.05.2012 / 20:18)
Виталик Альянс (19 Мая 2012 / 19:34)
переменная s1 почти всегда будет содержать большее значение остальных
Ну и что? Перемешай их, если это принципиально)
24.
Phantom (19.05.2012 / 20:54)
<?php
function getRandomNumbers($count,$sum){
$numbers=array();
for($i=$count;$i>1;$i--){
$rand=ceil(mt_rand(1,$sum)/$i);
$sum-=$rand;
$numbers[]=$rand;
}
$numbers[]=$sum;
shuffle($numbers);
return $numbers;
}
// Testing
$numbers=getRandomNumbers(4,100);
print_r($numbers);
echo "\r\n";
echo 'min: '.min($numbers)."\r\n";
echo 'max: '.max($numbers)."\r\n";
echo 'sum: '.array_sum($numbers)."\r\n";
?>
25.
Дмитрий (19.05.2012 / 21:02)
22.
ramzes, цифры в переменных - первый признак УГ кода. Рома, ты не похож сам на себя. Не ожидал.
26.
ramzes (19.05.2012 / 21:11)
26.
dima.london, ***код это ***овая логика кода, и непонятные имена обьектов.
А это наглядность
Добавлено через 05:55 сек.
з.ы. говн0код это долбанный сипле_хмл
27.
Саня (19.05.2012 / 21:52)
Бросайте этот пыхыпы и переходите на Rails
28.
Phantom (19.05.2012 / 22:53)
26.
dima.london, Ты сам-то понял, чо сказал? Цифры в переменных? Как раз цифры в переменных - нормальная практика.
Добавлено через 00:48 сек.
28.
sanzstez, рады бы, да велик даже с костылями по ним плохо едет.
29.
Дмитрий (19.05.2012 / 23:39)
sanzstez (19 Мая 2012 / 21:52)
Бросайте этот пыхыпы и переходите на Rails
Может быть ruby? rails это ведь фреймворк, а не яп .
30.
Вячеслав (19.05.2012 / 23:44)
$s1 = mt_rand(1, 100);
$s2 = mt_rand(1, 100-$s1);
$s3 = mt_rand(1, 100-$s1-$s2);
$s4 = 100-$s1-$s2-$s3;
echo $s1.' :: '.$s2.' :: '.$s3.' :: '.$s4;
49 :: 15 :: 35 :: 1
жалко быстро решаемая типа
31.
ramzes (19.05.2012 / 23:45)
31.
Trionix, что?
а понял. да, не учел
32.
Вячеслав (19.05.2012 / 23:48)
32.
ramzes, звыняй, на твоем коде доделал гг
33.
ramzes (20.05.2012 / 00:35)
33.
Trionix, только ты из него вырезал то что спасало от нулей
34.
Phantom (20.05.2012 / 00:46)
30.
akawin, А ты чо, не знал? На руби без рельсов никто не ездит. *TROLLFACE*
35.
Вячеслав (20.05.2012 / 00:52)
34.
ramzes, ноль может быть только в 4 значении и то, очень редко а от того и интересно)
36.
Phantom (20.05.2012 / 00:54)
36.
Trionix, В моём примере ноля никогда не будет. Но можно подправить код, чтобы ноль мог быть.
37.
ramzes (20.05.2012 / 01:28)
Trionix (20 Мая 2012 / 00:52)
34. ramzes, ноль может быть только в 4 значении и то, очень редко а от того и интересно)
<?
$s1 = mt_rand(1, 100); # тут выпадает сотня и все. система не работает
$s2 = mt_rand(1, 100-$s1);
$s3 = mt_rand(1, 100-$s1-$s2);
$s4 = 100-$s1-$s2-$s3;
38.
Петр (20.05.2012 / 06:53)
38.
ramzes, можно просто генерировать числа от 0. У димы лондона, кстати, та же ошибка. А вообще, идея у всех практически одна и та же, ничего оригинального, хоть она и дает хороший результат.
URL:
https://visavi.net/topics/32025