Генерировать случайное число в диапазоне 1 - 10
поскольку мой подход к тестовому запросу, над которым я работал в этом вопросе, не сработал, я сейчас пытаюсь что-то еще. Есть ли способ сказать pg random()
функция, чтобы получить мне только цифры от 1 до 10?
7 ответов:
если под числами от 1 до 10 вы подразумеваете любой поплавок, который >= 1 и
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 и
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)
чтобы подвести итог и немного упростить, вы можете использовать:
-- 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;
Если вы используете SQL Server, то правильный способ получить целое число -
SELECT Cast(RAND()*(b-a)+a as int);
здесь
- 'B' - это верхний предел
- ' a ' - это нижний предел
правильная версия ответа хитлодейра.
-- 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 включительно.
для любого числа (плавает), см. ответ user80168. то есть просто не преобразуйте его в
INTEGER
.
на самом деле я не знаю, что ты хочешь этого.
попробуй такое
INSERT INTO my_table (my_column) SELECT (random() * 10) + 1 ;
эта хранимая процедура вставляет номер rand в таблицу. Смотрите, он вставляет бесконечные числа. Прекратите выполнять его, когда вы получите достаточно чисел.
создать таблицу для курсора:
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