Я довольно новичок в программировании на 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);
жаль, что я пропустил «никаких дубликатов» тоже
– Нужно зацепиться за «дедупликатор» … я ставлю его в другом вопросе
Для генерации последовательности случайных чисел с фиксированной суммой:
(в основном для масштабирования случайной серии до ее нового размера)
Тогда есть ошибка округления для настройки:
Некоторая неслучайность, возникающая в результате этого, заключается в том, что величина исходных рандомов слишком мала, что приводит к детализации результата.
У меня нет 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);