Разделить 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* E не увидел название раздела

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. &#x202E;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, то нулевых значений в результате быть просто не может smile

20. Дмитрий (19.05.2012 / 16:31)
18. eGo Works 2 Yourself, чем тебя мой вариает не устраивает? Самый кошерный из представленных выше smile

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, цифры в переменных - первый признак УГ кода. Рома, ты не похож сам на себя. Не ожидал. sad

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

жалко быстро решаемая типа smile

31. ramzes (19.05.2012 / 23:45)
31. Trionix, что?
а понял. да, не учелsmile

32. Вячеслав (19.05.2012 / 23:48)
32. ramzes, звыняй, на твоем коде доделал гг

33. ramzes (20.05.2012 / 00:35)
33. Trionix, только ты из него вырезал то что спасало от нулейsmile

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