Intereting Posts
Вызов модели Laravel по строке Ошибка MySQL: «Количество столбцов не соответствует количеству значений в строке 1» – помощь для начинающих Выполнение команд оболочки unix с использованием PHP Неустранимая ошибка: Декларация .. должна быть совместима с .. PHP Ошибка получения идентификатора пользователя из веб-браузера Messenger даже после белого домена Как обновить меню «Выбрать» с помощью AJAX без <div> внутри формы Laravel 5.3 Пользовательский путь для перенаправления после аутентификации Загрузить данные MySQL Извлечение данных из объектов формы в виде массива значений Узнайте HTTP-метод в PHP Не удается получить доступ к данным из запроса jQuery Ajax, возвращает пустой массив Javascript JSON.parse responseText «Неожиданный конец ввода» Добавление ведущего 0 в php 403 Запрещено при передаче URL в переменной GET В CakePHP 1.3 есть ли обратный вызов для использования после `saveAll ()`?

Создавайте числа в массиве, которые суммируются до заданной суммы

Я довольно новичок в программировании на PHP. Таким образом, в основном, что мне нужно выполнить, создайте массив из х количество чисел (созданных случайным образом), значение которого добавляется до n :

Скажем, мне нужно создать 4 числа, которые составляют до 30. Мне просто нужен первый случайный набор данных. Здесь 4 и 30 являются переменными, которые будут заданы пользователем.

По сути, что-то вроде

x = amount of numbers; n = sum of all x's combined; // create x random numbers which all add up to n; $row = array(5, 7, 10, 8) // these add up to 30 

Кроме того, дубликаты не допускаются, и все числа должны быть целыми положительными.

Мне нужны значения внутри массива. Я когда-то общался с ним, однако мои знания довольно ограничены. Любая помощь будет оценена.

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

Я решил построить массив с самого низкого номера (и перетасовать их в конце). Это позволяет мне всегда выбирать случайный диапазон, который позволит получить допустимые результаты. Поскольку числа всегда должны увеличиваться, я решал для максимально возможного числа, что гарантирует, что действительное решение все еще существует (т. Е. Если n = 4 и max = 31, если первое число было выбрано равным 7, то оно не будет можно выбрать числа больше 7, так что сумма из 4 чисел будет равна 31).

 $n = 4; $max = 31; $array = array(); $current_min = 1; while( $n > 1 ) { //solve for the highest possible number that would allow for $n many random numbers $current_max = floor( ($max/$n) - (($n-1)/2) ); if( $current_max < $current_min ) throw new Exception( "Can't use combination" ); $new_rand = rand( $current_min, $current_max ); //get a new rand $max -= $new_rand; //drop the max $current_min = $new_rand + 1; //bump up the new min $n--; //drop the n $array[] = $new_rand; //add rand to array } $array[] = $max; //we know what the last element must be shuffle( $array ); , $n = 4; $max = 31; $array = array(); $current_min = 1; while( $n > 1 ) { //solve for the highest possible number that would allow for $n many random numbers $current_max = floor( ($max/$n) - (($n-1)/2) ); if( $current_max < $current_min ) throw new Exception( "Can't use combination" ); $new_rand = rand( $current_min, $current_max ); //get a new rand $max -= $new_rand; //drop the max $current_min = $new_rand + 1; //bump up the new min $n--; //drop the n $array[] = $new_rand; //add rand to array } $array[] = $max; //we know what the last element must be shuffle( $array ); 

EDIT: для больших значений $n вы получите множество сгруппированных значений в конце массива, так как есть хороший шанс, что вы получите случайное значение около максимального значения, заставив остальных быть очень близко друг к другу , Возможное исправление – иметь взвешенный ранд, но это вне меня.

Я не уверен, правильно ли я понял вас, но попробуйте это:

 $n = 4; $max = 30; $array = array(); do { $random = mt_rand(0, $max); if (!in_array($random, $array)) { $array[] = $random; $n--; } } while (n > 0); , $n = 4; $max = 30; $array = array(); do { $random = mt_rand(0, $max); if (!in_array($random, $array)) { $array[] = $random; $n--; } } while (n > 0); 

жаль, что я пропустил «никаких дубликатов» тоже
– Нужно зацепиться за «дедупликатор» … я ставлю его в другом вопросе

Для генерации последовательности случайных чисел с фиксированной суммой:

  • сделайте серию случайных чисел (наибольшей практической величины, чтобы скрыть гранулярность …)
  • рассчитать их сумму
  • умножать каждый последовательно по желаемому / сумме

(в основном для масштабирования случайной серии до ее нового размера)

Тогда есть ошибка округления для настройки:

  • пересчитать сумму и ее разницу от желаемой суммы
  • добавьте sumdiff к случайному элементу последовательно, если он не приводит к отрицательному, если он делает цикл для другого случайного элемента до штрафа.
  • чтобы быть ультратонким, вместо этого добавить или вычесть 1 бит в случайные элементы, пока sumdiff = 0

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

У меня нет php, но вот выстрел –

 $n = ; //size of array $targsum = ; //target sum $ceiling = 0x3fff; //biggish number for rands $sizedrands = array(); $firstsum=0; $finsum=0; //make rands, sum size for( $count=$n; $count>0; $count--) { $arand=rand( 0, $ceiling ); $sizedrands($count)=$arand; $firstsum+=$arand; } //resize, sum resize for( $count=$n; $count>0; $count--) { $sizedrands($count)=($sizedrands($count)*$targsum)/$firstsum; $finsum+=$sizedrands($count); } //redistribute parts of rounding error randomly until done $roundup=$targsum-$finsum; $rounder=1; if($roundup<0){ $rounder=-1; } while( $roundup!=0 ) { $arand=rand( 0, $n ); if( ($rounder+$sizedrands($arand) ) > 0 ) { $sizedrands($arand)+=$rounder; $roundup-=$rounder; } } 

Надеюсь, это поможет вам больше ….

Approch-1

 $aRandomarray = array(); for($i=0;$i<100;$i++) { $iRandomValue = mt_rand(1000, 999); if (!in_array($iRandomValue , $aRandomarray)) { $aRandomarray[$i] = $iRandomValue; } } 

Approch-2

 $aRandomarray = array(); for($i=0;$i<100;$i++) { $iRandomValue = mt_rand(100, 999); $sRandom .= $iRandomValue; } array_push($aRandomarray, $sRandom);