12

rand() だけでは十分ではないため、本当に乱数を生成するために mt_rand() を使用して関数を作成しようとしています。

問題は、数値の長さを事前に定義する必要があることです。たとえば、10 桁の乱数が必要です。

とにかく、私はいじっていて、これが私が思いついたものです:

    function randomNumber($length) {
        $min = str_repeat(0, $length-1) . 1;
        $max = str_repeat(9, $length);
        return mt_rand($min, $max);   
    }

理論的には(私が知る限り)うまくいくはずですが、そうではありません。長さは完全にランダムで、負の値もスローされます。

何か案は?

4

10 に答える 10

36

これらの量子静的なもののいずれかを持っていない限り、真の乱数を取得することはできません. ただし、Unix ベースの OS では、/dev/urandom本当に必要な場合は、「ランダム性を高める」ために機能します。

とにかく、n 桁の数字が必要な場合は、まさにそれを取得する必要があります: n 個の数字です。

function randomNumber($length) {
    $result = '';

    for($i = 0; $i < $length; $i++) {
        $result .= mt_rand(0, 9);
    }

    return $result;
}

既存のコードが機能しない理由0000...01は、 がまだ1mt_randあり、そのmt_rand範囲が無限ではないためです。負の数は整数オーバーフローです。

于 2012-10-31T23:55:29.753 に答える
8

短くて甘い:

00010 のような文字列ではなく、正当な数値のみを想定しています。数値のサイズを次のように使用してみてください。

  $min = pow(10, $length - 1) ;
  $max = pow(10, $length) - 1;
  return mt_rand($min, $max);   

唯一機能しないのは、長さが 1 の場合です。1 桁の数字 '0' は返される可能性のある値ではありません。

于 2012-10-31T23:57:25.357 に答える
6

これが私が使用しているものです:

function random_number($length)
{
    return join('', array_map(function($value) { return $value == 1 ? mt_rand(1, 9) : mt_rand(0, 9); }, range(1, $length)));
}

ワンラインでシンプルに!番号が 0 で始まることはなく、それ以外の場所では 0 を使用できます。

于 2015-09-10T06:13:32.743 に答える
2
function randomNDigitNumber($digits)
{
  $returnString = mt_rand(1, 9);
  while (strlen($returnString) < $digits) {
    $returnString .= mt_rand(0, 9);
  }
  return $returnString;
}

最初の行は、任意の数値の前に「0」がないことを保証します。たとえば、012、0598 などの値は破棄されます。残りは簡単です。

于 2017-01-06T20:20:15.560 に答える
1
function randomNumber($length) {
    $min = 1 . str_repeat(0, $length-1);
    $max = str_repeat(9, $length);
    return mt_rand($min, $max);   
}

連結 1 が間違った場所にあり、$length=2 の範囲は次のとおりです: {01,99} - 時には 01-09 であり、01-09 ではなく 1-9 として表されます。10 から始めてください。{10,99} が範囲になります。

于 2012-10-31T23:59:41.710 に答える
0

乱数を制約する長さから始めるべきではありません。十分な長さの出力を蓄積してから、適切な長さにカットします。

while (strlen($value) < $length) {
    $value .= str_pad(mt_rand(00000, 99999), 5, "0", STR_PAD_LEFT);
}
// as pairs of five were added before, eventually remove some again
return substr($value, 0, $length);

ゼロもランダムに生成され、保持される必要があるため、パディングはそこにある必要があります。

于 2012-10-31T23:57:01.693 に答える