web-dev-qa-db-ja.com

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

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

85
KB22

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)
138
user80168

要約して少し簡略化するには、次を使用できます。

-- 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;
13
vanburg

SQL Serverを使用している場合、整数を取得する正しい方法は

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

どこ

  • 「b」は上限です
  • 「a」は下限
8
Neha Jain

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

4
hythlodayr

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]でINTEGER出力を生成します(1と10の両方を含む)。

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

1
mythicalcoder

実際、あなたがこれを望んでいるのかわかりません。

これを試して

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

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

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

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

行く

番号を含むテーブルを作成します。

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
0