4

私は最近、失敗したことを達成するためのタスクを与えられました。私は通常論理を求めませんが、今日私は尋ねることに憤慨しています。これが仕事です。

phpのrand()関数を使用することは許可されていません。代わりに、この関数を使用できます。

function getRandom()
{
     return rand(1,5);
}

OK私はこの関数を試しましたが、3から7までの値を返すようにバインドされています。

function getMoreRandom()
{
    $value = getRandom();
    return $value + 2;

}

ここで、1から7の範囲の乱数を返すことができるphp関数を定義する必要があります。これを行うにはどうすればよいですか?

4

6 に答える 6

5
function getMoreRandom()
{
    do {
        $temp = 5 * (getRandom() - 1) + getRandom();
    } while ($temp > 21);

    return $temp % 7 + 1;
}
于 2013-01-25T13:28:04.283 に答える
4

flovの答えは正しいです:

function getMoreRandom()
{
    do {
        $temp = 5 * (getRandom() - 1) + getRandom();
    } while ($temp > 21);

    return $temp % 7 + 1;
}

それをテストする:

$aryResults = array_pad(array(),8,0);
foreach(range(0,100000) as $i) $aryResults[getMoreRandom()]++;
$intSum = array_sum($aryResults);
foreach($aryResults as $intValue => $intCount) printf("Value %d Count %d (%.2f)\n",$intValue,$intCount,$intCount/$intSum);

一様分布を生成します

Value 0 Count 0 (0,00)
Value 1 Count 14328 (0,14)
Value 2 Count 14316 (0,14)
Value 3 Count 14185 (0,14)
Value 4 Count 14197 (0,14)
Value 5 Count 14322 (0,14)
Value 6 Count 14361 (0,14)
Value 7 Count 14292 (0,14)

申し訳ありませんが、回答についてコメントしませんでした。明らかに、評判が悪いために私はできません(私はここで新しいです)。

于 2013-01-25T13:51:18.747 に答える
2

一様分布にはなりません(そして、一様分布である必要があることを指定しません)。

最も単純な解決策では、スケーリングやループを行う必要はありません。ランダムな1から5を取り、次にランダムな0から2を追加することができます。

function getMoreRandom()
{
    return getRandom() + getRandom() % 3;
}

ディストリビューションがどのように見えるかを確認するための簡単なテスト:

$results = array_fill(1, 7, 0);

for ($i = 0; $i < 1000000; $i++) {
    $results[rand(1,5) + rand(1,5) % 3]++;
}

var_dump($results);

述べたように、均一にランダムになるようには設計されていません。

array(7) {
  [1]=>
  int(39550) // 4%
  [2]=>
  int(120277) // 12%
  [3]=>
  int(200098) // 20%
  [4]=>
  int(199700) // 20%
  [5]=>
  int(200195) // 20% 
  [6]=>
  int(160200) // 16%
  [7]=>
  int(79980) // 8%
}

もう少し複雑で、@ flovsとは異なる方法です(彼のループ永遠に続く方法は好きではありません-ねえ、それはランダム性です)

function getMoreRandom()
{
    for (
        $i = 0, $v = 0;
        $i < 7;
        $i++, $v += getRandom()
    );

    return $v % 7 + 1;
}

これにより、一様分布が生成されます

array(7) {
  [1]=>
  int(14397)
  [2]=>
  int(14218)
  [3]=>
  int(14425)
  [4]=>
  int(14116)
  [5]=>
  int(14387)
  [6]=>
  int(14256)
  [7]=>
  int(14201)
}
于 2013-01-25T14:22:16.273 に答える
1

私の解決策:

<?php

function getRandom()
{
     return rand(1,5);
}

$random_number = getRandom();
$random_number += time();

$random_number = ($random_number % 7) + 1;
于 2013-01-25T13:41:27.863 に答える
0

いい質問に貢献するためだけに、これはもっと一般的なものかもしれないと思います。つまり、rand(1,5)に基づく1〜7ではなく、3〜7または1〜10などが必要になる可能性があります。

2次元配列を使用した別のソリューションを使用しているため、この関数は1〜25の数値で正常に機能します。

function getMoreRand($start, $end){
        $restart = $start; //Save $start value, to restart if we reach the $end number 
        $parser = 0; //Count number elements in 2d array
        $result = 0; //Return the result based on rand(1,5)

        //Create a 2d array(), 5x5 to simulate the 1-5 random number selection from rand(1,5)
        for($row = 0; $row < 5; $row++){
            for($col = 0; $col < 5; $col++){
                $vars[$row][$col] = $start;

                //If the array elements left <= selected range left
                if((25-$parser) <= ($end-$start)){
                    $vars[$row][$col] = 0;
                }else{
                    if($start == $end){
                        $start = $restart;
                    }else{
                        $start++;
                    }
                }       
                $parser++;

            }//END OF FOR COL LOOP
        }//END OF FOR ROW LOOP


        while($result == 0){
            $i = getRandom(); //Choose 1-5
            $j = getRandom(); //Choose 1-5
            $result = $vars[$i-1][$j-1]; //Get number from 2d array, based on rand(1,5)
        }

        echo $result;
    }
于 2013-01-25T15:49:19.123 に答える
-2
function getMoreRandom()
{
    $value = 0;
    for($i=1;$i<=5;$i++) $value += getRandom();
    return ($value % 7) + 1;
}
  • getRandomまず、 5回呼び出して、5〜25の範囲を取得します。これには正確に21の値(7の倍数)があります。
  • 次に、モジュラス7を見つけます。これにより、0から6までの数値が生成され、それぞれが21分の3、または7分の1になります。
  • 次に、正しい範囲に1つ追加します。
于 2013-01-25T13:20:08.930 に答える