Створіть випадкове число в діапазоні 1 - 10


95

Оскільки мій підхід до тестового запиту, над яким я працював у цьому питанні , не вийшов, зараз я намагаюся щось інше. Чи є спосіб сказати random()функції pg, щоб отримати мені лише числа між 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.create_at) + (trunc (випадковий () * 20)) з подій e; в результаті: ПОМИЛКА: оператор не існує: дата + подвійна точність Чи справді повернення даних повертає цілі числа?
Богдан Гусієв,

3
trunc()повертає той же тип даних, що і вхідний (як зазначено в посібнику). Потрібно привести результат до цілого числа:trunc(random() * 20)::int
a_horse_with_no_name

Цікаво, чи принаймні теоретично можливо, що random()поверне значення <1, яке при множенні на 9 буде> = 9 через неточну природу типу подвійної точності ? На практиці, навіть якщо це можливо, це було б малоймовірно, звичайно, через 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);
Сергій Колесніков

9

Якщо ви використовуєте SQL Server, то правильним способом отримання цілого числа є

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

Де

  • 'b' - це верхня межа
  • 'a' - нижня межа

Тут будьте обережні, якщо ви встановите нижню межу як 1, а верхню - 10, ви отримаєте лише числа 1-> 9. Інші відповіді, здається, припускають, що між 1 і 10 означає 1-> 9 ... Я вважаю, що якщо "між" виключає верхню межу, вона також повинна виключати нижню (тобто 2-> 9). SELECT Cast (RAND () * ((b + 1) -a) + a як int);
Морваль

Питання чітко позначено як питання PostgreSQL.
Себастьян Пальма

4

(магістраль (випадковий () * 10)% 10) + 1


ПОМИЛКА: оператора не існує: подвійна точність% integer

1
І для чого б ви все-таки використовували модуль? Ця логіка не має сенсу. Якщо ви отримаєте будь-яку «упаковку», ви не матимете рівного розподілу, а якщо ви її не отримаєте, вона вам не потрібна.
ErikE

1

Правильна версія відповіді гітлодаря.

-- 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

Насправді я не знаю, ти цього хочеш.

спробуйте це

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) 

ПОВЕРНУТИСЯ

Створіть таблицю, яка містить ваші номери:

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
Питання стосується Postgres, а не SQL Server
a_horse_with_no_name
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.