powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вывести 1000 случайных чисел
25 сообщений из 79, страница 3 из 4
Вывести 1000 случайных чисел
    #39663342
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Leanan,
всё просто, схема:
генеришь таличку N, R из 3*1000 строк
в N заполняешь числа от 1 до 1000 по 3 раза, в R заносишь рандомное число
дальше
Select n form T order by R limit 1000

Может проще.
Делаем три последовательности 1-1000 (3000 строк)
Перемешиваем.
Берем первые 1000
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663353
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
SELECT N FROM (select trunc(DBMS_RANDOM.value()*1E3) N from dual connect by level <= 10000)  GROUP BY n
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663357
Alexander_Ttl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
select x from
    (select mod(level,1000)+1 x
         from dual
         connect by level <= 3000)
ORDER BY dbms_random.random fetch first 1000 rows only;
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663359
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander_Ttl,
Код: plsql
1.
fetch first 1000 rows only


я так понял фишка 12-й версии?
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663361
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaxiflyДва арифметических действия (ну ok - можно и одно) (причем деления. Причем с округлением) это реально эффективнее двух UNION ALL?Чудак, это всяко лучше, чем владеть мастерством быдло-копи-паста.
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663363
Alexander_Ttl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2, да, 12с.

Сначала вариант с
Код: sql
1.
mod(trunc(dbms_random.VALUE(level, level+3)), 1000) +1

мне показался идеальным, но там действительно получается не случайные числа. Скажем, мы никогда не получим последовательность, не содержащую хотя бы одно число из 3-х идущих подряд, а это уже не случайные данные.
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663377
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander_Ttl,
мой вариант, выше, даёт псевдослучайную (использование любых библиотечных генераторов не даёт истинно СЧ) последовательность 1000 элементов в деапазоне 1..1000
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663383
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander_Ttl,
да, там есть "косячок", DBMS_RANDOM.value() генерит 0..1, и, может быть ситуация что trunc(DBMS_RANDOM.value()*1E3) = 0, что выпадает из условия 1..1Е3
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663388
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
SELECT CASE WHEN N <= 0 THEN 1 ELSE N END N FROM (SELECT trunc(DBMS_RANDOM.value()*1E3) n from dual connect by level <= 10000)  GROUP BY n


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
| Id  | Operation                      | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |      |     1 |    13 |     3  (34)| 00:00:01 |
|   1 |  HASH GROUP BY                 |      |     1 |    13 |     3  (34)| 00:00:01 |
|   2 |   VIEW                         |      |     1 |    13 |     2   (0)| 00:00:01 |
|*  3 |    CONNECT BY WITHOUT FILTERING|      |       |       |            |          |
|   4 |     FAST DUAL                  |      |     1 |       |     2   (0)| 00:00:01 |
Проверка
Код: plsql
1.
2.
3.
SELECT N, COUNT(*) I FROM (
SELECT CASE WHEN N <= 0 THEN 1 ELSE N END N FROM (SELECT trunc(DBMS_RANDOM.value()*1E3) n from dual connect by level <= 10000)  GROUP BY n
) GROUP BY N ORDER BY 1
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663390
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2DBMS_RANDOM.value() генерит 0..1
у этой ф-ции есть параметры
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663393
Alexander_Ttl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2, ты условия внимательно читал? Это должны быть случайные числа, но любое число из диапазона может повторяться не более 3 раз.
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663397
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander_TtlЭто должны быть случайные числа, но любое число из диапазона может повторяться не более 3 раз.
Так оно и есть "случайное" и не повторяется более 3х раз, в чем не так?
123ййу этой ф-ции есть параметры
Зачем они тут? Если произведение [0..1] х 1Е3 = 0..1E3 , что вполне совпадает с условием "из диапазона 1..1000".
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663403
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2Зачем они тут? Если произведение [0..1] х 1Е3 = 0..1E3 , что вполне НЕ совпадает с условием "из диапазона 1..1000".
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663410
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander_Ttlно любое число из диапазона может повторяться не более 3 раз.У него круче, все числа, кроме 1 и 1000 повторяются ровно один раз. Правда "случайность" зависит от строчки плана hash group by.
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663417
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2- "случайность" зависит от строчки плана hash group by.
Не совсем так, группировка тут на случайность никак не влияет, она вычленяет из уже полученных СЧ дубли.

123йй,
вполне подходит, найдите вероятность выпадения 0. А подменить 0 на любое другое число, включая и рандомное не сложно. :)
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663424
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2 найдите вероятность выпадения 0.
или выпадет или нет :)
stells2А подменить 0 на любое другое число, включая и рандомное не сложно. :)
зачем что-то подменять если можно сразу получить без него ?
и еще раз посмотри что хотел ТС 21508502
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663431
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123ййили выпадет или нет :)
сколько раз?
123ййзачем что-то подменять если можно сразу получить без него ?
и еще раз посмотри что хотел ТС 21508502
Получить 1000 случайных чисел от 1 до 1000, которые бы не повторялись более 3х раз.
Код: plsql
1.
SELECT case WHEN N <= 0 THEN CEIL(DBMS_RANDOM.value(1,1000)) ELSE N END N FROM (SELECT CEIL(DBMS_RANDOM.value()*1E3) n from dual connect by level <= 10000)  GROUP BY n


Покажи в чем результат не удовлетворяет условию?

Предложи свой вариант с DBMS_RANDOM.value(1,1000) что бы выполнялись все условия.
Я свой предложил, это вариант, их может быть много и уже дали другие. :)
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663436
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2-2- "случайность" зависит от строчки плана hash group by.
Не совсем так, группировка тут на случайность никак не влияет, она вычленяет из уже полученных СЧ дубли.Ну да. Сначала создал дубли, потом удалил... в итоге имеешь одну и ту же последовательность 1,1,2,3,...,999 (возможно с дырками, то есть меньшим, чем 1000 штук количеством). Порядок последовательности определяется способом группировки (no_)use_hash_aggregation.
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663451
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Ну да. Сначала создал дубли, потом удалил... в итоге имеешь одну и ту же последовательность 1,1,2,3,...,999 (возможно с дырками, то есть меньшим, чем 1000 штук количеством). Порядок последовательности определяется способом группировки (no_)use_hash_aggregation.
Может таки стоит выполнить запрос?
ровно 1000 элементов, со случайным набором от 1 до 1000.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
N
335
947
692
153
168
245
826
129
91
309
....
Я могу ошибаться конечно.
Чем эта выборка не удовлетворяет условию и чем она отличается от предложенных вариантов раннее?
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663463
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2Чем эта выборка не удовлетворяет условию и чем она отличается от предложенных вариантов раннее?Тем, что с вероятностью 4.4% вернет меньшее количество, чем 1000 элементов. Элементы не до 3х раз, а каждый один раз. В зависимости от выбора оптимизатора может вернуть упорядоченный набор. И при этом используются лишние 9000+1 обращений к dbms_random против лишних 2000 предлагаемых тут несколько раз разными авторами.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> alter session set "_gby_hash_aggregation_enabled"=false; -- спровоцировать оптимизатор

SQL> exec dbms_random.initialize(200) -- спровоцировать dbms_random

SQL> SELECT case WHEN N <= 0 THEN CEIL(DBMS_RANDOM.value(1,1000)) ELSE N END N FROM (SELECT CEIL(DBMS_RANDOM.value()*1E3) n from dual connect by level <= 10000)  GROUP BY n;

         N
----------
         1
         2
         3
...
       510
       511
       513
       514
...
       998
       999
      1000

999 rows selected. 
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663464
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2Может таки стоит выполнить запрос?
выполнил.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
select count(*)  from (
SELECT case WHEN N <= 0 THEN CEIL(DBMS_RANDOM.value(1,1000)) ELSE N END N FROM (SELECT CEIL(DBMS_RANDOM.value()*1E3) n from dual connect by level <= 10000)  GROUP BY n)
having count(*) <1000;

SQL> 
  COUNT(*)
----------

SQL> 
  COUNT(*)
----------

SQL> 
  COUNT(*)
----------

SQL> 
  COUNT(*)
----------

SQL> 
  COUNT(*)
----------
       999

SQL> 
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663469
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2Может таки стоит выполнить запрос?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
set serveroutput on
declare
cnt number;
begin
  while (1>0) loop
    begin
      select count(*) into cnt from (SELECT case WHEN N <= 0 THEN CEIL(DBMS_RANDOM.value(1,1000)) ELSE N END N FROM (SELECT CEIL(DBMS_RANDOM.value()*1E3) n from dual connect by level <= 10000)  GROUP BY n);
      if cnt < 1000 then
        begin
          dbms_output.put_line(cnt);
          exit;
        end;
      end if;
    end;
  end loop;
end;
/
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663513
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сегласен.
тогда
Код: plsql
1.
SELECT * FROM (SELECT LEVEL n from dual connect by level <= 1000) ORDER BY DBMS_RANDOM.value();


как тут вроде уже предлагали :)
просто перемешали 1..1000 в случайном порядке, нет повторов.
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663521
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stells2как тут вроде уже предлагали :)
просто перемешали 1..1000 в случайном порядке, нет повторов.
могу сказать больше. Первым же ответом.
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663541
Фотография stells2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123йй,
не, ну процесс же интересен :)
...
Рейтинг: 0 / 0
25 сообщений из 79, страница 3 из 4
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вывести 1000 случайных чисел
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]