2013-03-10 2 views
0

Мне нужно четыре разных случайных числа, не повторяя. Поэтому я взял для этого массив. Можете ли вы помочь мне, где я сделал ошибку? У меня 24 вопроса, чтобы прийти в случайном порядке, мне нужно 4 вопроса на страницу, для этого я взял массив «$ questions» и изначально вставил 25 в него. то когда когда-либо я получил случайное число, которое не находится в массиве, я заменяю этот конкретный индекс случайным числом. Где я сделал неправильно?несколько случайных чисел в php без повторения?

<?php 
$questions = array(0); 
for ($i = 0; $i < 24 ; $i++) { 
$questions[$i]= ","; 
} 

$a="1"; 
$b="2"; 
$c="3"; 
$d="4"; 
//$a=rand(0, 23); 
while(!in_array($a=rand(0, 23), $questions)) { 
    $replacements = array($a => $a); 
    $questions = array_replace($questions, $replacements); 
    $max = sizeof($questions); 
    if ($max==4) { 
     break; 
    } 
    echo "<br>a=".$a."<br>"; 
    for ($i = 0; $i < 24 ; $i++) { 
     echo $questions[$i]; 
    } 
} 
//echo "a=".$a."b=".$b."c=".$c."d=".$d; 
?> 
+3

Это много повторяющегося кода. Вы когда-нибудь слышали о [DRY] (http://en.wikipedia.org/wiki/Don%27t_repeat_yourself)? – Zeta

ответ

5

Я предлагаю рандомизации полный массив/установить один раз, затем разбить его на куски и хранить эти куски (например, в $ _SESSION).

<?php 
$questions = data(); // get data 
shuffle($questions); // shuffle data 
$questions = array_chunk($questions, 4); // split into chunks of four 
// session_start(); 
// $_SESSION['questions'] = $questions; 
// on subsequent requests/scripts do not re-create $questions but retrieve it from _SESSION 

// print all sets 
foreach($questions as $page=>$set) { 
    printf("questions on page #%d: %s\n", $page, join(', ', $set)); 
} 

// print one specific set 
$page = 2; 
$set = $questions[$page]; 
printf("\n---\nquestions on page #%d: %s\r\n", $page, join(', ', $set)); 


// boilerplate function: returns example data 
function data() { 
    return array_map(function($e) { return sprintf('question #%02d',$e); }, range(1,24)); 
} 
+0

Спасибо за ответ. Но что я сделал? –

+1

Я честно не понимаю, что вы там пытались. Может быть, вы должны объяснить свой алгоритм. – VolkerK

+0

наконец-то я реализовал, ваш volkerk algo. Спасибо. –

3

Вы могли бы сделать что-то вроде этого:

<?php 

$archive = array(); 
$span = 23; 
$amount = 4; 
$i = 0; 
while (true) { 
    $number = rand(0, $span);    // generate random number 
    if (in_array($number, $archive)) { // start over if already taken 
     continue; 
    } else { 
     $i++; 
     $archive[] = $number;    // add to history 
    } 
    /* 
     do magic with $number 
    */ 
    if ($i == $amount) break;    // opt out at 4 questions asked 
} 
+0

.. но мне действительно нравится решение VolkerK. –

+0

Хм. Я просто пытаюсь реализовать на моем пути. Я благодарен вам, ребята, за ваши ответы. Спасибо @Volkerk и спасибо вам также –

+0

Что я не сделал в реализации? –

Смежные вопросы