2009-03-18 5 views
8

두 가지 결과가있는 함수를 실행하고 싶지만 각각의 결과가 실제로 50 %가되도록하십시오. 나는 rand (0,1)가 갈 길이라고 가정하고 있지만, 아마도 다른 하나를 선호 할 수 있을지 궁금하다. 50/50 결과를 얻는 가장 좋은 방법은 무엇입니까?PHP rand() ... 50/50 결과가 참인지?

감사합니다.

EDIT : 감사합니다. 나는 무작위로하고 싶지는 않지만, 결과가 101010101이 아닌 111001101이되기를 바랍니다. 아마도 마지막 값 출력으로 데이터베이스를 업데이트 한 다음 반대 값을 반환해야합니까?

EDIT2 : 확인 마지막 수정이 오해의 소지가 있습니다. 나는 한 번 사용자 당 함수를 호출하고 그 값을 쿠키로 사용자에게 할당합니다. 방문하는 각 사용자가 1010101의 순서로 1 또는 0을 수신하도록하고 싶습니다.

+1

그렇다면 공정한 플립이 아닙니다! : P –

+0

내 게시물에 이것에 대해 간략하게 설명되어 있습니다. 실제 무작위성은 무작위로 숫자를 선호 할 수 있지만, 많은 숫자로 시작하여 무작위로 섞으면이 문제를 피할 수 있습니다 (다른 문제도 소개합니다). – Brian

+0

작업에 필요한 상황을 설명해 주시겠습니까? 데이터베이스 개입이 필요하지 않을 수도 있습니다. –

답변

2

이 번호를 사용하는 특정 상황 (예를 들어, 사용자 별 기준, 평생 응용 프로그램에 따라 $ _SESSION, 데이터베이스 값 등 여러 위치에 저장할 수 있습니다. 범위가 현재 페이지에만 적용되는 경우에는 해당 페이지의 코드에 직접 저장할 수 있습니다.

값을 전환하는 쉬운 방법은 다음과 같습니다 데이터베이스 호출에 대해

$val = 1 - $val; 

:

UPDATE YourTable SET `next_value` = 1 - `next_value` 

등 ...

+0

이 솔루션이 꽤 매끈한 것 같아요.하지만 실제로는 그다지 명백하지 않습니다 ... 누군가가이 코드를 쓰는 이유가 궁금해 할 것 같아요. 그리고 $ val (또는 next_value)가 어떻게 든 엉망이된다면 그때부터 모든 것이 잘못 될 것입니다. – Beska

+0

그래, 분명히 ToggleNextValue() 또는 뭔가 기능에 래핑 더 나은 것입니다,하지만 그는 정말 그가 변화하는 비즈니스가없는 값을 변경하지 않았는지 개발자에게 달렸어. –

1

the php manual에 따르면 rand (0,1)가 방법입니다. 그러나 모든 것은 난수 생성기가 얼마나 좋은지에 달려 있습니다.

1

실제로는 50/50이 아닙니다. 50/50을 원할 경우 처음 5 개의 결과가 1이고 다른 5 개가 2 등이되도록 함수를 만듭니다.

rand는 난수 생성을위한 것입니다. 즉, 같은 결과를 연속해서 10 번이나 줄 수 있다는 것보다는 무작위적임을 의미합니다. PHP mt_rand()에서

29

mt_rand(0,1); 

충분하고 꽤 좋은 50/50 값을 생성해야 더 나은 난수 생성기입니다. 에는, mt_rand에 대한

인용구 : 나이 libcs의

많은 난수 생성기는 모호한 또는 알 수없는 특성을 가지고 느리다. 기본적으로 PHP는 rand() 함수와 함께 libc 난수 생성기를 사용합니다. mt_rand() 함수는 이에 대한 대체 도구입니다.

»Mersenne Twister를 사용하여 알려진 특성을 가진 난수 생성기를 사용합니다.이 생성기는 평균 libc rand()가 제공하는 것보다 네 배 빠른 난수를 생성합니다.

Bill은 시각적 인 예에 관해 좋은 링크를 가졌습니다. 나는 (PHP 5.1.6 리눅스를) PHP는 사용자가 PHP 거기에 있었다 그러나 그는 코드를 포함하기 때문에 난 내 서버에 호스팅 것을 모르는

10

편집 된 질문에 대한 답변 : 정확한 50 % 비율을 유지하려면 임의성이 원하는 마지막 것입니다. 귀하의 목적을 위해서 당신은 단지 새로운 사용자 (쿠키가 발견되지 않음)에 데이터베이스의 자동 번호를 할당 한 다음 짝수 번호의 사용자에게 한 페이지를 제공하고 홀수 번호의 사용자에게 다른 페이지를 부여하기를 원할 것입니다.

if(($user_id % 2) == 0) 
    // user id is even 
else 
    // user id is odd 

원래 답 : PHP의 랜드() 함수는 특히 좋은 의사 난수 생성기 (A Simple Visual Example 참조)이 아니다. 대신 mt_rand()을 권하고 싶습니다.

2

모두의 mt_rand(0,1)을 시도 할 수 있습니다 (랜드()와에는, mt_rand()) 좋은 50 %/50 %의 확률을 반환합니다.

$array1 = array(0,0); 
$array2 = array(0,0); 

for ($x = 0; $x < 10000; $x++) { 
    $array1[mt_rand(0,1)] ++; 
    $array2[rand(0,1)] ++; 
} 

print_r($array1); 
print_r($array2); 

결과 :

Array 1 (mt_rand): 
    [0] => 4910 
    [1] => 5090 
Array 2 (rand): 
    [0] => 4970 
    [1] => 5030 

저자의 요청에 따라, 그가 공정한 분배를 원하는 여기

은 예입니다. 따라서 다음과 같이 시도하십시오.

$digits = 200; 
$array = array_fill(0, $digits/2, 0); 
for ($x = 0; $x < $digits/2; $x++) 
    $array[] = 1; 
shuffle($array); 

균등 분포와 충분히 랜덤합니다. (Brian이 제안)

0

가짜 임의성은 절대로 임의적 일 수 없습니다. 시드 나 다른 방법을 기반으로하는 난수 계산은 미니 패턴과 같이 명백한 방식으로 나타날 수도 있고 그렇지 않을 수도있는 사전 결정 성을 가지고 있습니다. 당신이 기대할 수있는 최선은 거의 50/50입니다.

1

면책 조항 :이 특정 문제에 대해 할 수있는 어리석은 일이지만, 당신이 당신의 난수 생성기를 불신 주장하는 경우 균등 ... 배포 할

AA 50/50 결과 때를 생성하기위한 고전적인 알고리즘 당신은 당신의 생성기가 고르게 분포되는 것을 다음의 알고리즘이라고 믿지 않습니다. 이 알고리즘은 의사 난수보다 임의의 숫자를 고정하기위한 더 의도이며, 실제로 모드 기반의 결과를 악화시킬 수 있음에 유의하십시오

  1. 생성이 난수 비트 A와 B
  2. ==의 B의 경우, 고토 1
  3. 반환 B

당신은 또한 단지 (균등하게 분배) 1과 0의 많은 시작하여 무작위로 셔플하여 동일한 분포를 보장 할 수 있습니다.

0

과 0 :

$n = 0; 
$myval = ($n==1 ? $n=0 : $n=1); 
0

당신이 심각하게 반대 값을 반환하려면 각 반복마다 ...

function flip() { 
    static $truthiness = false; 
    $truthiness = !$truthiness; 
    return $truthiness; 
} 
true, false, true, false, true 등을 반환해야하는 0

...

당연히 PHP 인터프리터가 호출간에 메모리에 남아있는 경우에만 작동합니다.

정적 키워드가 무엇인지 모르는 경우 variable scope의 PHP 매뉴얼 항목을 참조하십시오.

+0

맞습니다.하지만이 기능은 사용자별로 한 번만 실행됩니다. 다른 시스템에있는 다른 사람이 방문 할 때 내가 각 방문자에 대해 의미하는 10101을 말하면서 oppisite를 원합니다. –

+0

mod_php 또는 APC와 같은 것을 사용하고 있다면, 사용자간에 정적 변수를 유지한다고 생각합니다. 현재 내가있는 곳을 테스트 할 방법이 없습니다 (여기서 Java/C#을 사용합니다). – Powerlord

0

이 10101010은 무작위가 아니며 패턴입니다.

당신의 목표는 더 많은 판매를 생성하는 페이지의 버전을 확인하는 것입니다
결과 =

0

이 원래 게시물에 대한 귀하의 코멘트에 대한 응답이다 초래하지.

연속적인 방문자마다 ABABAB을 뒤집기보다는 방문자에게 각 페이지를 무작위로 표시하는 것이 더 적합합니다.

귀하의 방법으로 체계적인 편견이 생기는 이유는 상상할 수 없지만이를 배제 할 수는 없습니다. (멀리 가져온 시나리오 : 일부 추적 봇은 사용자를 페이지로 추적하므로 사용자 1은 A, 로봇 B는 B, 사용자 2는 A, 로봇 B는 B 등)

더 나은 임의성을 달성하는 것이 더 현명합니다. 각 페이지가 정확히 50 %의 시간 동안 표시되는지 확인하는 것보다 더 많은 연구를하는 것입니다.

1

RobS는 기본적으로 각 사용자가 연속 번호를 얻을 수 있다고 말하면서 그 숫자 % 2를 사용하여 0 또는 1을 얻습니다. 그러면 어떤 페이지가 게재 될지 결정됩니다. 물론, 심지어 그것은 정확히 50/50의 비율을 제공하는 것이 절대적으로 보장되는 것은 아닙니다 ... 그것은 홀수의 사람들 일 수 있습니다!

또한 사용자를 어떻게 결정 하느냐에 따라 번호가 매겨진 사람들이 구매할 가능성이 높기 때문에 어떤 종류의 상관 관계가 있는지를 확인할 가치가있을 수 있습니다. 그렇지만 염두에 두어야 할 것이 있습니다.

예기치 않은 예기치 않은 상관 관계에 대해 걱정할 필요가없는 대체 솔루션이 있습니다. 사용자의 의견과 수정 된 질문을 바탕으로 두 개의 다른 페이지가 얼마나 효과적인지 비교 분석하는 것입니다. 레이아웃은 무작위로 제공된 횟수만큼 각 페이지 레이아웃 판매를 간단하게 나눌 수 있습니다. 즉, 난수 생성기를 사용하고 페이지 A를 제공하기 위해 0을 제공하는 횟수와 페이지 B를 제공하기 위해 1을 제공하는 횟수를 추적합니다.

페이지에서 5 만 달러 A는 43 안타, 38 안타 페이지 B에 매출 $ 46,000에, 당신은 단순히 페이지 B에게 약간의 우위를주기 ...

Page A      Page B 

50000      46000 
----- = 1163 $/hit   ----- = 1211 $/hit 
    43       38 

수학을.

관련 문제