[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Создание чисел сумму которых необходимо указать
12345
подскажите, как организовать! необходимо сделать, чтоб создавалось определенное кол-во чисел(дробных, с одним знаком после запятой прим: 0.2 или 1.7 и т.д.) и чтоб сумма их была какая-то определенная.

Дапустим, мне необходимо создать 5 чисел, и чтоб сумма их была равна 7. В итоге я получаю случайных пять чисел: 2.2, 0.9, 2.8, 0.6, 0.5. а сумма этих чисел равна 7ми



Спустя 21 минута, 37 секунд (20.07.2012 - 22:55) Placido написал(а):
Могут ли выпасть два или больше одинаковых числа (например, 6.5, 0.4, 0.1, 0, 0, 0, 0)?

Спустя 19 минут, 28 секунд (20.07.2012 - 23:15) 12345 написал(а):
Могут. Только число должны быть больше чем 0 и с одной точкой после запятой

Спустя 14 минут, 52 секунды (20.07.2012 - 23:29) Placido написал(а):
Что-то вроде этого:
$a = 7;
for ($i = 0; $i < 4; $i++)
{
$numbers[$i] = rand(0 , $a*10)/10;
$a -= $numbers[$i];
}
$numbers[] = $a >= 0.1 ? $a : 0;
print_r($numbers);

Спустя 11 часов, 27 минут, 30 секунд (21.07.2012 - 10:57) 12345 написал(а):
Вроде всё нормально, только 0 появляется, как зделасть, чтоб числа 0 не мог быть

Спустя 1 час, 18 минут, 54 секунды (21.07.2012 - 12:16) pak написал(а):
А у меня так получилось:

$n = 7;
$d = 5;

if($n > $d and $d != 1)
{
$k = ($n/$d)*10;

for($i = 0; $i < $d-1; $i++)
$arr[$i] = mt_rand(1, $k)/10;

$s = array_sum($arr);
if($s != $n)
$arr[] = $n - $s;

echo array_sum($arr);
}

print_r($arr);

Выход:

7
Array
(
[0] => 0.4
[1] => 1.1
[2] => 0.7
[3] => 1
[4] => 3.8
)
////////////////////
7
Array
(
[0] => 0.2
[1] => 1.4
[2] => 1.3
[3] => 1.1
[4] => 3
)
///////////////////
7
Array
(
[0] => 1
[1] => 0.1
[2] => 1.3
[3] => 1.1
[4] => 3.5
)
///////////////////
.............

Спустя 48 минут, 57 секунд (21.07.2012 - 13:05) 12345 написал(а):
pak, всё нормально работает. Но если задать $n < $d , т.е. допустим $n = 10; $d = 50;
То скрипт не работает. А у меня будет всегда $n < $d

Спустя 9 минут, 47 секунд (21.07.2012 - 13:15) pak написал(а):
замени $n > $d, на $n < $d

Спустя 8 минут, 23 секунды (21.07.2012 - 13:23) 12345 написал(а):
А подскажи, как сделать, чтоб было 2 числа после запятой

Спустя 39 минут, 45 секунд (21.07.2012 - 14:03) pak написал(а):

if($d != 1)
{
$k = ($n/$d)*100;

for($i = 0; $i < $d-1; $i++)
$arr[$i] = mt_rand(1, $k)/100;

$s = array_sum($arr);
if($s != $n)
$arr[] = $n - $s;

echo array_sum($arr);
}

Спустя 4 часа, 48 минут, 10 секунд (21.07.2012 - 18:51) 12345 написал(а):
T
Цитата
if($d != 1)
{
$k = ($n/$d)*100;

for($i = 0; $i < $d-1; $i++)
  $arr[$i] = mt_rand(1, $k)/100;
 
$s = array_sum($arr);
if($s != $n)
  $arr[] = $n - $s;
 
echo array_sum($arr);
}


Если установить
$n = 10; $d = 50;
, то последнее число какоето уж очень большое. Нельзя ли сделать его поменьше?(оно где-то содержит 50% от $n )

Спустя 57 минут, 40 секунд (21.07.2012 - 19:48) pak написал(а):
незнаю, вроде работает, просто делал одним глазам)

$n = 10;
$d = 50;

if($n < $d and $d != 1)
{
$k = ($n/$d)*100;

for($i = 0; $i < $d-1; $i++)
$arr[$i] = mt_rand(1, $k)/100;

$s = array_sum($arr);
if($s != $n)
{
echo $o = floor($n-$s);
$a = array_rand($arr, $o);
for($i = 0; $i < $o; $i++)
{
$arr[$a[$i]]++;
}
}


$arr[] = round($n-$s-$o,3);

echo array_sum($arr);
}


print_r($arr);


Спустя 25 минут, 45 секунд (21.07.2012 - 20:14) 12345 написал(а):
Спасибо, то что надо)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.