MYSQLを使用して乱数を作成する


95

選択クエリと一緒に100から500の間でランダムに生成された数を選択する方法があることを知りたいです。

例えば: SELECT name, address, random_number FROM users

この番号をdbに保存する必要はなく、表示目的でのみ使用します。

私はこのようなものを試しましたが、動作しません。

SELECT name, address, FLOOR(RAND() * 500) AS random_number FROM users

誰かが私を助けてくれることを願っています。ありがとうございました


1
このリンクをご覧ください stackoverflow.com/questions/1045138/...
DevelopmentIsMyPassion

回答:


145

これはあなたが望むものを与えるはずです:

FLOOR(RAND() * 401) + 100

一般的に、>から両端を含むFLOOR(RAND() * (<max> - <min> + 1)) + <min>数値を生成します。<min<max>

更新

この完全なステートメントはうまくいくはずです:

SELECT name, address, FLOOR(RAND() * 401) + 100 AS `random_number` 
FROM users

このコードの使用方法。私はこのように試しました-数値としてFLOOR(RAND()* 401)+ 100が機能しません
TNK

注:データベースに「number」という名前の列はありません。これは動的に生成される列でなければなりません。それは可能ですか?
TNK、2013

1
@EdHeal実際、私round()は不均一な分布を与えると思います。
ジャック・

1
結果を変数に保存し、マスタースレーブレプリケーションがある場合はその変数を使用することをお勧めします。SET @r=FLOOR(RAND() * 401) + 100、その後SELECT @r
Qian Chen

3
RAND()UUID()NOW()決定不能な機能です。そのような関数の呼び出しは、複製のためにビンログに書き込まれないようにする必要があります。例えば。フィールドINSERT INTO t SET ID=UUID();の値がIDマスターとスレーブで異なる原因になります。代わりにSET @uuid:=UUID();、として記述してから、INSERT INTO t SET ID=@uuid;それらを単一のトランザクションで実行する必要があります。これは複製安全です。これは、この質問の少しずれたトピックです。答えに問題がないとは言えません。:)
Qian Chen

10

RAND数0を生成<= V <1.0(参照ドキュメントを)あなたが使用する必要がありますROUND、上限(この場合は500)と下限(この場合は100)を確実に取得するためするます。

したがって、必要な範囲を生成するには:

SELECT name, address, ROUND(100.0 + 400.0 * RAND()) AS random_number
FROM users

このコーディングは次のように機能します-SELECT ROUND(100.0 + 400.0 * RAND())AS random_numberですが、今は私のクエリで機能しています
TNK

random_number列は、クエリと共にランダムに生成された列でなければなりません。
TNK、2013

1
この方法では、最初と最後の数が少なくなります。
Slobodan Pejic

4

この答えに加えて、次のような関数を作成します

CREATE FUNCTION myrandom(
    pmin INTEGER,
    pmax INTEGER
)
RETURNS INTEGER(11)
DETERMINISTIC
NO SQL
SQL SECURITY DEFINER
BEGIN
  RETURN floor(pmin+RAND()*(pmax-pmin));
END; 

のように呼び出します

SELECT myrandom(100,300);

これにより、100〜300の乱数が得られます


3

FLOOR(RAND() * n) as randnum(nは整数)を使用して乱数を作成できますが、同じ乱数を繰り返す必要がない場合は、一時テーブルにいくらか格納する必要があります。だからあなたはそれに対してチェックすることができますwhere randnum not in (select * from temptable)...


3

これらは両方ともうまく機能しています:

select round(<maxNumber>*rand())

FLOOR(RAND() * (<max> - <min> + 1)) + <min> // generates a number
between <min> and <max> inclusive.

0

これは、整数から検索する正しい式であるijどこにi <= R <= j

FLOOR(min+RAND()*(max-min))

3
これは間違っています。j(またはmax)が生成されることはありません。数値i <= R <jを生成します。
jlh

1
する必要があります:FLOOR(min+RAND()*(max-min+1))
デビッド・ロドリゲス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.