Генерация случайного числа в диапазоне 1 - 10 - PullRequest
84 голосов
/ 09 сентября 2009

Поскольку мой подход к тестовому запросу, над которым я работал в , этот вопрос не сработал, сейчас я пробую что-то другое. Есть ли способ сообщить функции pg random(), чтобы я получал только цифры от 1 до 10?

Ответы [ 7 ]

136 голосов
/ 09 сентября 2009

Если под числами от 1 до 10 вы подразумеваете любое число с плавающей запятой, которое> = 1 и <10, то это просто: </p>

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, тогда все просто: </p>

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)
12 голосов
/ 29 августа 2015

Чтобы подвести итог и немного упростить, вы можете использовать:

-- 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;
8 голосов
/ 20 июня 2016

Если вы используете SQL Server, правильный способ получить целое число -

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

Где

  • 'b' - верхний предел
  • 'a' - нижний предел
4 голосов
/ 09 сентября 2009

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

1 голос
/ 19 июля 2017

Правильный вариант ответа гифлодера.

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

Выход из trunc должен быть преобразован в INTEGER. Но это можно сделать без trunc. Вот и получается все просто.

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

Генерирует выход INTEGER в диапазоне [1, 10], т.е. как 1, так и 10 включительно.

Информацию о любом числе (с плавающей точкой) см. В ответе пользователя 80168. т.е. просто не конвертируйте его в INTEGER.

0 голосов
/ 27 января 2017

Эта хранимая процедура вставляет номер ранда в таблицу. Смотри, он вставляет бесконечные цифры. Прекратите выполнять его, когда наберете достаточное количество цифр.

создать таблицу для курсора:

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
0 голосов
/ 21 января 2014

На самом деле я не знаю, что вы хотите этого.

попробуйте это

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