2015-03-21 2 views
0

Например, я получил это число 110Число порождающее с определенными правилами использования PHP

Пусть Nx целого числа

Можно ли генерировать N1 на N8 (N1 до N8 представляет собой целое число) с помощью PHP, которые ограничивают следующие правила:

N1 + N2 + N3 + N4 + N5 + N6 + N7 + N8 = 110?

Не понял, какую функцию (например, rand(), mt_rand(), используя петли и т. Д.), Может это сделать PHP.

+1

Каковы правила отношений между N1 и N2 и т. Д.? – BigScar

+0

Просто случайные числа, это могут быть любые целые числа, которые могут быть суммированы как 110 в конце. – DarkAmazon

+2

Тогда ответ «да, вы можете сделать это на PHP». rand(), mt_rand() и петли, вероятно, будут эффективны. Попробуйте написать код и посмотреть, что произойдет. – BigScar

ответ

0

кратчайшее решение для вашей проблемы, что я могу думать, было бы:

$m = 110; // desired sum 
$v = 8; // desired elements 
$x = []; // result 

for($i = 1; $i < $v; $i++) 
    $x[$i] = rand(1, $m - array_sum($x) - (($v - $i) * $v)); 
$x[0] = $m-array_sum($x); 

// print results 
print_r($x); 
printf("Elements sum to: %d\n",array_sum($x)); 

что приводит к

Array 
(
    [1] => 16 
    [2] => 13 
    [3] => 15 
    [4] => 23 
    [5] => 5 
    [6] => 7 
    [7] => 1 
    [0] => 30 
) 
Elements sum to: 110 

так ура, только то, что вы хотели, хотя это может быть оптимизирован для лучше распространение. но позвольте мне объяснить строку для строки.

Сначала я только что инициализировал три переменные. $m - желаемая сумма, которую вы хотите иметь для всех ваших элементов. $v - количество элементов (N), которые вы хотите сгенерировать. и $x содержит массив со всеми N о том, что где вычисляется, так что результат нас интересует:

$m = 110; // desired sum 
$v = 8; // desired elements 
$x = []; // result 

Теперь мы начинаем цикл по элементам, которые мы хотим вычислить. Заметьте, что мы начинаем с 1, так как мы будем использовать 0 для вычисления последнего значения позже:

for($i = 1; $i < $v; $i++) 

и сейчас здесь идет «умственный» мы устанавливаем текущий элемент $x[$i] для случайной величины. в PHP мы можем передавать значения min и max в случайную функцию, поэтому я выбрал 1 как min, чтобы избежать 0 и max, которые я выбрал. Я объясню немного более подробно в конце, но, очевидно, мы хотим избежать того, чтобы в качестве первого значения было 110 а остальные нули, и это, как мы делаем так:

$x[$i] = rand(1, $m - array_sum($x) - (($v - $i) * $v)); 

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

$x[0]=$m-array_sum($x); 

последние строки кода просто распечатывать результаты, но, как и обещал, позвольте мне объяснить «complica ted "макс часть случайной функции, которую я выбрал.

$m - array_sum($x) - (($v - $i) * $v) 

функция один PHP, который приходит очень удобно здесь является array_sum функция, которая добавляет все элементы массива. если бы мы просто набрали rand(1,110) на каждый элемент, тогда мы могли бы легко получить сумму выше , поэтому мы вычитаем сумму всех существующих элементов из максимального значения, чтобы избежать этого из первых рук: $m - array_sum($x). поэтому, если последние три генерируемые элементы составляют до , то следующий элемент может быть не выше (110 - 43).мы все равно могли бы получить результат вроде (12,7,24,5,62,0,0,0), и мы не получим нулей, поэтому нам придется вычесть количество оставшихся элементов $v - $i, которые будут избегайте нулей.

снова мы все же можем получить результат вроде (12,7,24,5,59,1,1,1), и это не выглядит красиво, поэтому последняя оптимизация заключалась в том, чтобы умножить это на произвольное номер, чтобы оставить больше места для более высоких значений - в этом случае я просто использовал $v (количество элементов) как произвольное число, но вы можете играть с этим значением, т.е. (($v - $i) * 12)), пока не получите желаемый результат.

+0

Это действительно не набор случайных чисел. Это своего рода набор случайных чисел, дополненных 1s. – Elin

+0

уверен, что это! если вы проверите его, вы увидите ... я просто дал образец с 1s, чтобы показать, что произойдет, если вы избежите «смягчения» максимального значения. это можно было бы еще более усовершенствовать, но на самом деле из моих тестовых прогонов у меня было не более 7 единиц на 10 итераций - единственное неслучайное значение - это последнее, которое в моем случае никогда не будет «1», но так как это максимум минус сумма случайных значений, достаточно случайная, поэтому, пожалуйста, проверьте код перед комментированием! –

+0

Какова вероятность получить 7 1s случайно, если вы выбираете 8 случайных чисел от 1 до 100? – Elin

0

Большое спасибо! Почти так же, как и я.

$m = 110; // desired sum 
$v = 8; // desired elements 
$x = []; // result 

for($i = 1; $i < $v; $i++) 
    $x[$i] = mt_rand(1, $m - array_sum($x) - (($v - $i) * $v)); 
$x[] = $m-array_sum($x); 

// print results 
print_r($x); 
printf("Elements sum to: %d\n",array_sum($x)); 

Я изменил RAND() в mt_rand(), которые могли бы ранд вещи быстрее
И $x[0] = $m-array_sum($x); =>$x[] = $m-array_sum($x);

Так что массив может начинаться с 1 и заканчивается 8

Array 
(
    [1] => 16 
    [2] => 13 
    [3] => 15 
    [4] => 23 
    [5] => 5 
    [6] => 7 
    [7] => 1 
    [8] => 30 
) 
Elements sum to: 110 
Смежные вопросы