2010-04-15 6 views
1

난수에 따라 다른 순서로 항목을 출력하는 함수가 있습니다. 예를 들어 1/2의 시간은 뽀빠이와 그 목록에서 1 위를 차지할 것이며 타코 벨과 로고는 2 위, 절반은 시간의 절반이 될 것입니다.PHP의 의사 난수

사용자가 페이지를 다시로드하거나 페이지로 돌아 오면 문제가 다시 발생합니다. $ Range 여기에는 db의 항목 수가 있으므로 1에서 $ 범위 사이의 임의의 숫자가 사용됩니다.

$random = mt_rand(1,$range); 
    for ($i = 0 ; $i < count($variants); $i++) { 
    $random -= $variants[$i]['weight']; 
    if ($random <= 0) { 
     $chosenoffers[$tag] = $variants[$i]; 
     break; 
    } 
    } 

나는 세션의 시작 부분에 가서이 설정 : 나도 같은 일을 사용하는 의사 난수 생성기의 일종으로 기능의에는, mt_rand를 대체 할 수있는 아이디어와

if (!isset($_SESSION['rannum'])){ 
    $_SESSION['rannum']=rand(1,100); 
    } 

을 -100 난수를 세션 전체의 시드로 사용합니다. 그런 식으로 이미 작성된 모든 코드를 다시 작성할 필요가 없습니다. 잘못된 나무를 짖거나 좋은 생각입니까?

+1

을 말했듯이 세션의 씨앗을 saveing ? – Ozzy

답변

3

은해야 작업에 무엇인가

<?php 
srand(1); 
echo rand(); 
// 1804289383 
srand(1); 
echo rand(); 
// 1804289383 
?> 

또는 각각의

<?php 
mt_srand(1); 
echo mt_rand(1, 100); 
//58 
mt_srand(1); 
echo mt_rand(1, 100); 
//58 
?> 

방금 ​​array_shuffle를 사용 해달라고 왜

+0

정말 조언을 주셔서 감사합니다. 매력처럼 작동합니다. –

+0

오, 한 가지 질문. 내 사이트의 다른 곳에서 mt_rand에 대한 다른 언급이 여러 가지 워드 프레스 플러그인에 있습니다. mt_rand가 사용되는 다른 인스턴스가 있다면 어떻게 될까요? 예를 들어 akismet (wordpress plugin)도 mt_rand를 사용합니다. mt_rand의 특정 인스턴스에 대해서만 시드를 설정하는 방법이 있습니까? –

+0

아니요 다음에 오는 모든 mt_rand 호출에만 시드 할 수 있습니다. 그러나 그것은 정말로 문제가되어서는 안됩니다. 내가 중요한 사건을 만들 수있을 것 같아. _really_ (_really_) 코드 뒤에서 진짜 랜덤 해지려면/dev/random과 같은 무작위 소스에서 다시 시드해야합니다. 늦게 답장을 보내 주셔서 죄송합니다. – edorian

1

질문에 답하는 중입니다. 하나의 접근 방식 *입니다.

하지만 체크 아웃 : http://www.php.net/manual/en/function.mt-srand.php. PHP mt_rand는 Mersenne Twister로, 이미 PRNG이며 seed 함수를 가지고 있습니다.

* 그러나 백업 소스가 변경되면 여전히 잘못되었습니다. 아차 : -/

+0

당신은 질문에 잘 대답했고 사실 나는 두 답을 모두 사용했지만 에드리안이 먼저 대답했습니다. –