1から10の範囲の乱数を生成します


95

この質問で取り組んだテストクエリに対する私のアプローチがうまくいかなかったので、今は別のことを試みています。pgのrandom()関数に1から10までの数値のみを取得するように指示する方法はありますか?

回答:


152

1と10の間の数値で、1以上かつ10未満のフロートを意味する場合、それは簡単です。

select random() * 9 + 1

これは以下で簡単にテストできます:

# select min(i), max(i) from (
    select random() * 9 + 1 as i from generate_series(1,1000000)
) q;
       min       |       max
-----------------+------------------
 1.0000083274208 | 9.99999571684748
(1 row)

> = 1と<10の整数が必要な場合、それは簡単です:

select trunc(random() * 9 + 1)

また、簡単なテスト:

# select min(i), max(i) from (
    select trunc(random() * 9 + 1) as i from generate_series(1,1000000)
) q;
 min | max
-----+-----
   1 |   9
(1 row)

イベントeから日付(e.created_at)+(trunc(random()* 20))を選択します。結果:エラー:演算子が存在しません:日付+倍精度truncは本当に整数を返しますか?
ボグダングシエフ2010年

3
trunc()マニュアルに記載されているように、入力と同じデータ型を返します。あなたは整数に結果をキャストする必要がありますtrunc(random() * 20)::int
a_horse_with_no_name

少なくとも理論的には、倍精度型の不正確な性質のrandom()ために、9を掛けると> = 9になる値<1を返す可能性があるのでしょうか。実際には、可能であっても、15桁程度の精度があるため、もちろんそれはほとんどありません。

1
私はwidth_bucket(random(), 0, 1, 10)別の方法として

私は数学をまったく理解していないと告白しますが、私の恐れは根拠がないように見えます:-)

17

要約して少し単純にするために、以下を使用できます。

-- 0 - 9
select floor(random() * 10);
-- 0 - 10
SELECT floor(random() * (10 + 1));
-- 1 - 10
SELECT ceil(random() * 10);

そして、あなたは@ user80168によって言及されたようにこれをテストすることができます

-- 0 - 9
SELECT min(i), max(i) FROM (SELECT floor(random() * 10) AS i FROM generate_series(0, 100000)) q;
-- 0 - 10
SELECT min(i), max(i) FROM (SELECT floor(random() * (10 + 1)) AS i FROM generate_series(0, 100000)) q;
-- 1 - 10
SELECT min(i), max(i) FROM (SELECT ceil(random() * 10) AS i FROM generate_series(0, 100000)) q;

2
ドキュメントは言う、「0.0 <= X <1.0でランダムな値」をので、少なくとも理論的にチャンスがありceil(random() * 10)、私はに固執するだろう- 0で結果がfloor

1
私は@JackDouglasに同意するので、1〜10の範囲である必要がありますSELECT floor(random() * 10 + 1);
SergiyKolesnikov

9

SQL Serverを使用している場合、整数を取得する正しい方法は次のとおりです。

SELECT Cast(RAND()*(b-a)+a as int);

どこ

  • 「b」は上限です
  • 「a」は下限です

ここで注意してください。下限を1に、上限を10に設定すると、1から9までの数値しか得られません。他の回答は、Between 1と10が1-> 9を意味すると想定しているようです。SELECT Cast(RAND()*((b + 1)-a)+ a as int);
Morvael 16

質問はPostgreSQLの質問として明確にタグ付けされています。
セバスチャンパルマ

4

(trunc(random()* 10)%10)+ 1


エラー:演算子が存在しません:倍精度%整数

1
そして、なぜとにかくモジュラスを使用するのですか?この論理は意味がありません。「ラッピング」が発生した場合、均等な分布は得られません。また、ラッピングが発生しない場合は、不要です。
ErikE 2012

1

hythlodayrの回答の正しいバージョン。

-- ERROR:  operator does not exist: double precision % integer
-- LINE 1: select (trunc(random() * 10) % 10) + 1

からの出力truncはに変換する必要がありINTEGERます。しかし、それはなしで行うことができますtrunc。したがって、それは単純であることがわかります。

select (random() * 9)::INTEGER + 1

範囲[1、10]、つまり1と10の両方でINTEGER出力を生成します。

任意の数値(float)については、user80168の回答を参照してください。つまり、単にに変換しないでくださいINTEGER


0

実は私はあなたがこれをしたいのかわかりません。

これを試して

INSERT INTO my_table (my_column)
SELECT
    (random() * 10) + 1
;

0

このストアドプロシージャは、ランド番号をテーブルに挿入します。見てください、それは無限の数を挿入します。十分な数を取得したら、実行を停止します。

カーソルのテーブルを作成します。

CREATE TABLE [dbo].[SearchIndex](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Cursor] [nvarchar](255) NULL) 

GO

数値を含むテーブルを作成します。

CREATE TABLE [dbo].[ID](
[IDN] [int] IDENTITY(1,1) NOT NULL,
[ID] [int] NULL)

スクリプトの挿入:

INSERT INTO [SearchIndex]([Cursor])  SELECT N'INSERT INTO ID  SELECT   FLOOR(rand() * 9 + 1)  SELECT COUNT (ID) FROM ID

手順の作成と実行:

CREATE PROCEDURE [dbo].[RandNumbers] AS
BEGIN
Declare  CURSE  CURSOR  FOR (SELECT  [Cursor] FROM [dbo].[SearchIndex]  WHERE [Cursor] IS NOT NULL)
DECLARE @RandNoSscript NVARCHAR (250)
OPEN CURSE
FETCH NEXT FROM CURSE
INTO @RandNoSscript 
WHILE @@FETCH_STATUS IS NOT NULL 
BEGIN
Print @RandNoSscript
EXEC SP_EXECUTESQL @RandNoSscript;  
 END
 END
GO

あなたのテーブルを埋めてください:

EXEC RandNumbers

3
問題はSQL ServerではなくPostgresに関するものです
a_horse_with_no_name '27年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.