powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вывести 1000 случайных чисел
25 сообщений из 79, страница 1 из 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
25 сообщений из 79, страница 1 из 4
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вывести 1000 случайных чисел
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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