powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вывести 1000 случайных чисел
79 сообщений из 79, показаны все 4 страниц
Вывести 1000 случайных чисел
    #39511001
Leanan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!
Необходимо вывести 1000 случайных чисел от 1 до 1000, таких что не повторяются в этой
последовательности, больше чем 3 раза.

Собственно вывод чисел

SELECT trunc(dbms_random.VALUE(1, 1000)) random_val
FROM dual
CONNECT BY LEVEL <= 1000;

Вопрос в том как сделать чтобы числа не повторялись больше чем 3 раза?
Буду очень благодарен за помощь!!!
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511026
Leanan,

Просто сгенерировать последовательность от 1 до 1000 и рандомно отсортировать её :)
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511341
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут можно делать union нескольких последовательностей от 1 до 1000.
Не более трех.

И сортировать по hashcode(номер последовательности, level).
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511437
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - ЭхLeanan,

Просто сгенерировать последовательность от 1 до 1000 и рандомно отсортировать её :)

імхо
от сортироки к-во повторов не уменьшится напр сгенерилось пять пятерок, надо оставить три и две догенерить

....
stax
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511527
StaxДобрый Э - ЭхПросто сгенерировать последовательность от 1 до 1000 и рандомно отсортировать её :)от сортироки к-во повторов не уменьшитсяИ не увеличится! Не уменьшенное и не увеличенное количество 1 будет равно ровно 1.
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511543
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
последовательность от 1 до 1000Staxпропущено...
от сортироки к-во повторов не уменьшитсяИ не увеличится! Не уменьшенное и не увеличенное количество 1 будет равно ровно 1.
поясню на примере
напр dbms_random плохо генерит (так звезды стали)
сгенерил 700 пятерек и 300 восьмерок
по условию "числа не повторялись больше чем 3 раза" (подходит 6-ть чисел - 3 пятерки и 3 восьмерки)
нам надо догенерить 994 числа среди корых тоже могут быть повторяющиеся

пробовал моделькой, но пока не придумал как посчитать в тч повторяющиеся, отбросив повторы больше трех

сортировка тут нипричем

ps
можно в лоб генерить напр 2000 чисел и лишнее отбросить, но гарантии то нет что и 2000 хватит

.....
stax
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511565
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Можно например так попробовать, но гарантии тоже нет и будет уникальность (но 1 точно не более 3 )
Код: plsql
1.
2.
3.
4.
5.
6.
7.
with t as (SELECT trunc(dbms_random.VALUE(1, 1000)) random_val 
FROM dual 
CONNECT BY LEVEL <= 10000)

select distinct random_val
from t
FETCH FIRST 1000 ROWS ONLY;
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511577
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL,

distinct не подходит нужны повторы, иначе 20751402

.....
stax
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511582
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL,

в догонку
селект вернул 999 записей, а надо 1000

.....
stax
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511591
Бракованный финский угорь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Подожди, пусть автор даст объяснение почему его не устраивает вариант Доброго Эха, а уж потом будешь постить в тему свои неудержимые измышлизмы.
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511601
Рогафип
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
SELECT  trunc(dbms_random.VALUE(level, level+3))   random_val
FROM dual
CONNECT BY LEVEL <= 1000
order by sin( dbms_random.VALUE(1, 39458))
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511604
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бракованный финский угорьStax,

Подожди, пусть автор даст объяснение почему его не устраивает вариант Доброго Эха, а уж потом будешь постить в тему свои неудержимые измышлизмы.

понятно что автору может подойти решение Добрый Э - Эх

но есть и другая задача (с дублями), я ее пока что не решил (хотел моделькой)

....
stax
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511623
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рогафип,

красивый вариат

допилить вариант random_val >1000

.....
stax
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511628
Рогафип
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Код: plsql
1.
2.
 
mod(trunc(dbms_random.VALUE(level, level+3)), 1000)  
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511640
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РогафипStax,

Код: plsql
1.
2.
 
mod(trunc(dbms_random.VALUE(level, level+3)), 1000)  


не пойдет

1-4 --> 1.7
2-5 --> 1.9
3-6 --> 1.1
999-1002 -->1001,3

....
stax
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511655
Рогафип
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

mod(x,1000) < 1000 для любого x
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511672
Рогафип
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чтоб совсем точно были значения от 1 до 1000

Код: plsql
1.
mod(trunc(dbms_random.VALUE(level, level+3)), 1000) +1
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511675
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaxMaximaXXL,

в догонку
селект вернул 999 записей, а надо 1000

.....
stax

Согласен
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
with t as (SELECT trunc(dbms_random.VALUE(1, 1000)) random_val 
FROM dual 
CONNECT BY LEVEL <= 2000)

select lag(null,3,random_val) over (partition by random_val order by random_val)
from t
order by 1
FETCH FIRST 1000 ROWS ONLY;
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511691
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РогафипStax,

mod(x,1000) < 1000 для любого x

да, но возможен "4-й дубль", я ж привел пример

....
stax
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511725
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLStaxMaximaXXL,

в догонку
селект вернул 999 записей, а надо 1000

.....
stax

Согласен
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
with t as (SELECT trunc(dbms_random.VALUE(1, 1000)) random_val 
FROM dual 
CONNECT BY LEVEL <= 2000)

select lag(null,3,random_val) over (partition by random_val order by random_val)
from t
order by 1
FETCH FIRST 1000 ROWS ONLY;



order by 1 портит картинку
маленкие числа подтянет, большие отбросит

зы
order by nvl2(lag,level,null) при условии что 2000 хватит

....
stax
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511739
Рогафип
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
StaxРогафипStax,

mod(x,1000) < 1000 для любого x

да, но возможен "4-й дубль", я ж привел пример

....
stax

А, в этом смысле. Согласен. Тогда можно просто level+3 заменить на level+2.
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511754
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РогафипА, в этом смысле. Согласен. Тогда можно просто level+3 заменить на level+2.

халява, троек "почти" не будет

.....
stax
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511765
Landgraf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так:

Код: plsql
1.
2.
 select trunc(dbms_random.VALUE(level, Decode(level,999,1000,1000,1000,level + 2))) as RandomNumber
        from dual connect by level<=1000
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511767
Рогафип
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
StaxРогафипА, в этом смысле. Согласен. Тогда можно просто level+3 заменить на level+2.

халява, троек "почти" не будет

.....
stax

) Да, не красиво.

Но я тут подумал, и понял. что в варианте
Код: plsql
1.
mod(trunc(dbms_random.VALUE(level, level+3)), 1000) +1



не будет 4-х дублей.

Дубли возможны из-за того, что в начале и в конце есть повторяющиеся интервалы, из которых случайно выбираются значения. Сразу оговоримся, что trunc(dbms_random.VALUE(1, 1+3)) выдает только одно из трех значений - 1,2,3 (ибо The VALUE function produces numbers in the range [0,1) with 38 digits of precision)

1-2-3
2-3-4
....
999-1000-1001
1000-1001-1002

Рассмотрим эти случаи.
из первого интервала случайно выбрали 1. Тогда mod(trunc(1, 1000) +1 = 2.
Из каких еще интервалов можно получить 2 ?
из 2-3-4 - нет.
из 999-1000-1001 - если выбрать 1001,
из 1000-1001-1002 - если выбрать 1001.

Итого итоговая двойка может встретиться только трижды, а не четырежды.

Если из первого интервала выбрали 2, то в итоге mod(trunc(1, 1000) +1 = 3.
Из второго 2 - получим второе итоговое число 3.
Ну и из последнего интервала 1002 - вот она и третья тройка.

Так что никаких четверных дублей вроде не получается....
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511781
Рогафип
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Рогафип,
Исправление - в предыдущем посте mod(trunc(1),1000)+1 и
mod(trunc(2),1000)+1.
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511792
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РогафипНо я тут подумал, и понял. что в варианте
Код: plsql
1.
mod(trunc(dbms_random.VALUE(level, level+3)), 1000) +1



не будет 4-х дублей.


согласен

.....
stax
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511793
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это уже не случайные числа
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511796
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxЭто уже не случайные числа

dbms_random.VALUE - случайные?

......
stax
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511799
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaxandreymxЭто уже не случайные числа

dbms_random.VALUE - случайные?

......
staxдо тех пор, пока их не начинают использовать "это хочу, это не хочу"
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511802
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaxandreymxЭто уже не случайные числа

dbms_random.VALUE - случайные?

......
stax
Код: sql
1.
2.
3.
SELECT DBMS_RANDOM.VALUE (1, 1) AS RandomNumber
  FROM DUAL
CONNECT BY LEVEL <= 1000
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511805
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxStaxпропущено...


dbms_random.VALUE - случайные?

......
stax
Код: sql
1.
2.
3.
SELECT DBMS_RANDOM.VALUE (1, 1) AS RandomNumber
  FROM DUAL
CONNECT BY LEVEL <= 1000



не подходит (из диапазона 1-1000)

.....
stax
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511808
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

обоснуй :)
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511814
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxStax,

обоснуй :)

при любом к-ве прогонов получим 1000 еденичек (что допускается, редкий случай - но возможен)

надо хотя-бы иногда из диапазана 1-1000 и хотя-бы иногда дубли

.....
stax
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39511886
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собсно... почему такая тема в форуме Oracle вообще вызывает трудность?

В любом языке программирования есть реализация функции shuffle (перемешивание).
На входе - коллекция. На выходе коллекция перемешанная настолько что
нет оснований говорить о какой-то исходной упорядоченности.

В Oracle надо просто сделать order by hashcode(.... набор потенциальных ключей ...) или
rowid.

Может потому-что операция "перемешивания" не применима к курсору?
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39512007
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСобсно... почему такая тема в форуме Oracle вообще вызывает трудность?

В любом языке программирования есть реализация функции shuffle (перемешивание).
На входе - коллекция. На выходе коллекция перемешанная настолько что
нет оснований говорить о какой-то исходной упорядоченности.

В Oracle надо просто сделать order by hashcode(.... набор потенциальных ключей ...) или
rowid.

Может потому-что операция "перемешивания" не применима к курсору?
20752559
в рерультате перемешивания дубли появятся?

......
stax
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39512037
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я спросил. Почему. Данная элементарная задача вызывает трудности для oracle кодера?
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39512047
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ спросил. Почему. Данная элементарная задача вызывает трудности для oracle кодера?

Ваше решения задачи с учетом дублей?

.....
stax
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39512065
не то?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select rn, count(*)
from (
select rn from (
select rownum rn from dual connect by level <= 1000 union all
select rownum rn from dual connect by level <= 1000 union all
select rownum rn from dual connect by level <= 1000
 )
order by dbms_random.value 
)
where rownum <= 1000 
group by rn 
order by count(*) desc, rn
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39512066
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax, не оптимально
Код: plsql
1.
 select mod(level, 1000) from dual connect by level< =1000*кол-во повторов 


"Смешать, но не взбалтывать" 1000шт
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39512278
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Декартовым произведением ещё можно.
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39662740
Maxifly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select lvl
  from (select lvl
          from (select level lvl
                  from dual
                connect by level <= 1000
                UNION ALL
                select level lvl
                  from dual
                connect by level <= 1000
                UNION ALL
                select level lvl
                  from dual
                connect by level <= 1000)
         ORDER BY DBMS_RANDOM.value)
 where rownum <= 1000)
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39662744
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxifly,

предлагали. и утроюнионивание запроса для умножения строк на три не самый оптимальный подход.
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39662755
Maxifly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Maxifly,

утроюнионивание запроса для умножения строк на три не самый оптимальный подход.

А оптимальный какой?
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39662811
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxifly-2-Maxifly,

утроюнионивание запроса для умножения строк на три не самый оптимальный подход.А оптимальный какой?Более оптимально в твоем варианте считать до level/3 <= 1000 без юниона. А самый оптимальный указан в первом же ответе "Просто сгенерировать последовательность от 1 до 1000".
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39662911
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeananНеобходимо вывести 1000 случайных чисел от 1 до 1000
Просто вывести числа от 1 до 1000.
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39662919
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leanan,

всё просто, схема:

генеришь таличку N, R из 3*1000 строк
в N заполняешь числа от 1 до 1000 по 3 раза, в R заносишь рандомное число

дальше
Select n form T order by R limit 1000
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39662963
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

21505134

....
stax
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663018
Maxifly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Maxiflyпропущено...
А оптимальный какой?Более оптимально в твоем варианте считать до level/3 <= 1000 без юниона.".

Может я чего не понял, но
Код: plsql
1.
select level from dual connect by level/3 <= 1000

возвращает числа от 1 до 3000
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663033
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxifly,

select ...level/3... from ...

....
stax
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663326
Maxifly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,
Два арифметических действия (ну ok - можно и одно) (причем деления. Причем с округлением) это реально эффективнее двух UNION ALL?
...
Рейтинг: 0 / 0
Вывести 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
Вывести 1000 случайных чисел
    #39663655
evkbr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вариант на T-SQL.
Подскажите, насколько он оптимален?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
DECLARE @counter int = 1;
DECLARE @nmb int;
DECLARE @rn int;


WHILE( @counter <= 1000)
  BEGIN

    SET @nmb = (SELECT CONVERT(int, RAND() * 1000));
    INSERT INTO rnd(num, cnter) VALUES(@nmb, @counter);

    SET @rn = (SELECT rn FROM(
        SELECT * ,
        ROW_NUMBER() over(PARTITION BY num ORDER BY cnter) rn FROM rnd) a WHERE cnter = @counter);
    IF(@rn <= 3)
      SET @counter += 1;
    ELSE
      DELETE FROM rnd
      WHERE cnter = @counter;

  END
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663656
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
evkbrT-SQL.
ПодскажитеФорумом ошибся.
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663663
Maxifly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicMaxiflyДва арифметических действия (ну ok - можно и одно) (причем деления. Причем с округлением) это реально эффективнее двух UNION ALL?Чудак, это всяко лучше, чем владеть мастерством быдло-копи-паста.
Чувачок, разговор шел об эффективности кода а не о мастерстве решить задачу нажимая меньше кнопок на клаве.
...
Рейтинг: 0 / 0
Вывести 1000 случайных чисел
    #39663672
Рогафип
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexander_Ttlstells2, да, 12с.

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

мне показался идеальным, но там действительно получается не случайные числа. Скажем, мы никогда не получим последовательность, не содержащую хотя бы одно число из 3-х идущих подряд, а это уже не случайные данные.

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


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