Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 случайное число из диапазона  [new]
NewIvanovec
Member

Откуда: Msk
Сообщений: 581
в таблице bar есть поле num со значениями элементов > 95000.
в это поле будут добавляться новые значения, которые тоже будут > 95000.
как сделать так, чтобы выводилось случайное число >95000, которое не будет
совпадать с уже имеющимися в поле num значениями ?
26 июн 17, 15:24    [20590965]     Ответить | Цитировать Сообщить модератору
 Re: случайное число из диапазона  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36965
select top 1 num from bar a where num > 95000 order by newid()
26 июн 17, 15:33    [20590992]     Ответить | Цитировать Сообщить модератору
 Re: случайное число из диапазона  [new]
NewIvanovec
Member

Откуда: Msk
Сообщений: 581
Гавриленко Сергей Алексеевич
select top 1 num from bar a where num > 95000 order by newid()


Спасибо!
26 июн 17, 15:45    [20591028]     Ответить | Цитировать Сообщить модератору
 Re: случайное число из диапазона  [new]
Remind
Member

Откуда: UK
Сообщений: 523
Гавриленко Сергей Алексеевич,

Ну тут скорее

select top 1 n from dbo.Numbers n where n > 95000
  and not exists (select 1 from bar b where b.num = n.n)
order by newid()
26 июн 17, 16:21    [20591192]     Ответить | Цитировать Сообщить модератору
 Re: случайное число из диапазона  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
4я тема за три недели.

Это где то на собеседовании спрашивают?
26 июн 17, 17:35    [20591574]     Ответить | Цитировать Сообщить модератору
 Re: случайное число из диапазона  [new]
rnk
Member

Откуда:
Сообщений: 126
Remind
Гавриленко Сергей Алексеевич,

Ну тут скорее

select top 1 n from dbo.Numbers n where n > 95000
  and not exists (select 1 from bar b where b.num = n.n)
order by newid()

А newid() строго случайно или могут быть закономерности? Может, надёжнее так?
select top 1 n from dbo.Numbers n where n > 95000
  and not exists (select 1 from bar b where b.num = n.n)
order by CRYPT_GEN_RANDOM(16)
26 июн 17, 18:43    [20591819]     Ответить | Цитировать Сообщить модератору
 Re: случайное число из диапазона  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7754
rnk,

вроде бы только аппаратные генераторы случайных чисел гарантируют.
26 июн 17, 19:19    [20591933]     Ответить | Цитировать Сообщить модератору
 Re: случайное число из диапазона  [new]
rnk
Member

Откуда:
Сообщений: 126
Владислав Колосов
вроде бы только аппаратные генераторы случайных чисел гарантируют.

Там всё непросто, и добавление энтропии не панацея. Но CRYPT_GEN_RANDOM (надо полагать, базирующийся на Microsoft CryptoAPI) всё-таки специально разрабатывался и тестировался для получения псевдослучайных чисел приемлемого качества, чего не скажешь про NEWID.
27 июн 17, 10:44    [20593009]     Ответить | Цитировать Сообщить модератору
 Re: случайное число из диапазона  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36965
rnk
Владислав Колосов
вроде бы только аппаратные генераторы случайных чисел гарантируют.

Там всё непросто, и добавление энтропии не панацея. Но CRYPT_GEN_RANDOM (надо полагать, базирующийся на Microsoft CryptoAPI) всё-таки специально разрабатывался и тестировался для получения псевдослучайных чисел приемлемого качества, чего не скажешь про NEWID.
Я бы еще перфоманс этих двух функций замерил.
27 июн 17, 10:51    [20593048]     Ответить | Цитировать Сообщить модератору
 Re: случайное число из диапазона  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
rnk
Владислав Колосов
вроде бы только аппаратные генераторы случайных чисел гарантируют.

Там всё непросто, и добавление энтропии не панацея. Но CRYPT_GEN_RANDOM (надо полагать, базирующийся на Microsoft CryptoAPI) всё-таки специально разрабатывался и тестировался для получения псевдослучайных чисел приемлемого качества, чего не скажешь про NEWID.
NEWID() вызывает те же функции API.
Когда-то здесь были сообщения на эту тему.
27 июн 17, 12:12    [20593499]     Ответить | Цитировать Сообщить модератору
 Re: случайное число из диапазона  [new]
rnk
Member

Откуда:
Сообщений: 126
Гавриленко Сергей Алексеевич
Я бы еще перфоманс этих двух функций замерил.

Вот, нашёл:
Generate random integers without collisions

NEWID заметно быстрее и генерирует последовательности с меньшим числом повторений, что практически удобно, но является отклонением от строгой случайности.
27 июн 17, 14:02    [20593863]     Ответить | Цитировать Сообщить модератору
 Re: случайное число из диапазона  [new]
NewIvanovec
Member

Откуда: Msk
Сообщений: 581
Remind,

спасибо, так правильнее к моей задачи. так соблюдается уникальность
27 июн 17, 17:58    [20594716]     Ответить | Цитировать Сообщить модератору
 Re: случайное число из диапазона  [new]
NewIvanovec
Member

Откуда: Msk
Сообщений: 581
Remind
Гавриленко Сергей Алексеевич,

Ну тут скорее

select top 1 n from dbo.Numbers n where n > 95000
  and not exists (select 1 from bar b where b.num = n.n)
order by newid()


странный код :) откуда dbo.Numbers
27 июн 17, 18:04    [20594734]     Ответить | Цитировать Сообщить модератору
 Re: случайное число из диапазона  [new]
Remind
Member

Откуда: UK
Сообщений: 523
NewIvanovec,

Служебная таблица с натуральными числами. Создайте и заполните, пригодится и не раз.
27 июн 17, 18:38    [20594805]     Ответить | Цитировать Сообщить модератору
 Re: случайное число из диапазона  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7754
Remind,

не поверите, но за последние 15 лет ни разу не пригодилась.
28 июн 17, 10:28    [20595839]     Ответить | Цитировать Сообщить модератору
 Re: случайное число из диапазона  [new]
Remind
Member

Откуда: UK
Сообщений: 523
Владислав Колосов,

Почему же не поверю, вы наверняка из тех, кто любит на лету генерировать подоные последовательности при помощи рекурсии или джойна spt_values на саму себя.
28 июн 17, 13:46    [20596627]     Ответить | Цитировать Сообщить модератору
 Re: случайное число из диапазона  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7754
Remind,

нет, мне вообще не требовались последовательности для решения задач. Я к тому, что таблица последовательностей далеко не must have в любой базе. Это узко специфичная вещь.
28 июн 17, 13:48    [20596634]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить