PHPを使用した範囲[最小-最大]の乱数


84

最小値と最大値に基づいて乱数を生成する方法はありますか?

たとえば、最小値が1で最大値が20の場合、1から20までの任意の数を生成する必要がありますか?


1
新しいphpバージョンには、暗号的に安全な乱数ジェネレーターがあります。
サルバドールダリ

1
PHP 7以降の場合random_int()は、、、random_bytes()またはを使用しますopenssl_random_pseudo_bytes() 。@Salvador Daliが言ったrand()ように、暗号的に安全な結果は生成されません。ドキュメントを参照してくださいphp.net/manual/en/function.rand.php
FrozenFire

回答:


147
<?php
  $min=1;
  $max=20;
  echo rand($min,$max);
?>

randの最小値と最大値は、数字ではなく使用する桁数だと思いました:) thnx
Val

関連:の場合PHP_INT_MAX < ($max-$min)この回答で説明されているように、間隔を一緒に追加する必要があります
ビショップ

PHP7.1より前のrand()は単に悪いです。これは、予測可能な出力をもたらすLCGアルゴリズムを使用します。それも遅いです。PHP7.1 rand()はmt_rand()のエイリアスになっているので、悪くはありません。PHP7は暗号的に安全なrandom_int()も導入しましたが、mt_rand()よりもはるかに遅いため、必須でない限り避ける必要があります
xZero 2018

34

新しいPHP7では、最終的に暗号的に安全な疑似乱数整数がサポートされます。

int random_int ( int $min , int $max )

random_int —暗号的に安全な疑似乱数整数を生成します

これは基本的に以前の回答を時代遅れにします。


2
それは素晴らしいことです!しかし、WebホストがPHP7をよりグローバルにサポートするまで、残念ながら、これは配布用の製品を構築する人にとっては役に立ちません。したがって、PHP7でも機能するという以前の回答は依然としてベストプラクティスです。
マットクロムウェル

1
@MattCromwell。私はあなたに賛成しない。ホスティングサービスがPHP7をサポートするまでは、polyfill for andfunctionを使用する必要がrandom_intありrandom_bytesます--github.com/paragonie/random_compat
ウラジミールポスビステリック2017年

興味がありますが、使用しない理由はありますrandom_int か?それが「より良い」乱数を与えるなら、なぜ暗号以外の理由でそれを使用しないのですか?
ブライアンリーシュマン2017

1
@BrianLeishman私はむしろそれをすべてに使用したいと思います。私が推測できる唯一の欠点は、おそらくランダム性の原因に依存しており、ランダム性がない場合は失敗する可能性があるということです。それはもっと高価かもしれません(チェックする必要があります)が、この1つの関数が大きな違い
Salvador Dali

遅いことは知っていますが、戻って既存random_intのsをrandsに変更しないほど重要ではありません。また、私のユースケースは再試行アルゴリズムであり、予測可能なランダムな整数のために、スリープ後に複数の失敗した関数が凝集することを絶対に望んでいません
Brian Leishman

19

速く速くバージョンはmt_rand使用します。

$min=1;
$max=20;
echo mt_rand($min,$max);

出典:http//www.php.net/manual/en/function.mt-rand.php

注:これを機能させるには、サーバーでMathPHPモジュールを有効にする必要があります。そうでない場合は、ホストにバグを報告して有効にするか、通常の(そしてより遅い)rand()を使用する必要があります。


6
あなたはより速いという意味ですか?違いは(タイピング==速いvs速い==パフォーマンスの面で)
Val

english.stackexchange.com/questions/31732/…-実際には両方である可能性があります
pee2pee


6

ここに回答をまとめて、バージョンに依存しないようにしました。

function generateRandom($min = 1, $max = 20) {
    if (function_exists('random_int')):
        return random_int($min, $max); // more secure
    elseif (function_exists('mt_rand')):
        return mt_rand($min, $max); // faster
    endif;
    return rand($min, $max); // old
}


0

これを試してください。それはあなたの望みに応じてIDを生成します。

function id()
{
 // add limit
$id_length = 20;

// add any character / digit
$alfa = "abcdefghijklmnopqrstuvwxyz1234567890";
$token = "";
for($i = 1; $i < $id_length; $i ++) {

  // generate randomly within given character/digits
  @$token .= $alfa[rand(1, strlen($alfa))];

}    
return $token;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.