Является ли NEWID() равномерно распределённой функцией?

Достаточно ли написать в SQL Server 2017

SELECT x FROM y
ORDER BY NEWID()

для того, чтобы быть точно уверенным в том что все созданные значения будут равномерно распределёнными между собой?

Т.к. это GUID v4, то генерация основана на псевдослучайных числах. Но будет ли всё множество созданных чисел NEWID() создано с одинаковой вероятностью или шанс оказаться в каком-то диапазоне чисел отличится от общего?

Если не является, то является ли следующее выражение равномерно распределённым?

SELECT x FROM y
ORDER BY CHECKSUM(NEWID())

Ответы (1 шт):

Автор решения: MaxU

Вот простенький тестовый db<>fiddle, в котором я генерирую 10.000 значений при помощи функции NEWID() и анализирую частотность первого символа GUID.

Пример значений (select top(20) * from #guids;):

UUID
F722B553-EABA-42CA-8E56-6EF34071651F
55C2BF49-543D-49C1-A75F-9D1850FABFAD
36DC258A-6545-4623-B139-1423A394AAF8
5FF078FC-5C22-4ED1-A9B7-448D34996394
5A653501-74C7-4A9A-9DBB-BAC797B987BA
90CE5C28-41A4-410A-AF47-D3E4529FCEA4
0BC67F34-4B10-4EDB-8B4E-B7BD7ED41235
F0E2E50B-123E-4A68-BB3E-F00B949D928A
4EFAFC75-0222-4CA3-BC7D-1B578BC60F60
1A8390F4-0734-4D8D-9641-51157DC672F2
11E1F65D-580E-440E-8DC6-E79158A75B75
7E5F1EBA-24AE-4663-BBD8-AE66519DF4E7
1526650B-5268-47AB-93DD-36465CE624DD
19B79A84-A13B-4E41-A288-C587689D49C9
D3B2F5EC-AC39-49F2-8FF7-3D1320E9526A
1193825C-3F39-47ED-9B7A-1880DAD7DFA8
0B237D0E-CD58-4EA1-A31B-250CB186C236
5C9F1821-DA95-4E77-8BFF-2EDE94E3407C
159EFB92-7985-4F38-AAE8-A8ADACFF74FB
8DF4491A-2030-452E-8A07-F074456294BD

частотность первого символа (select * from #guids_stats order by counter desc;):

first_letter    counter
7   6373
E   6340
3   6323
9   6318
4   6310
8   6288
A   6257
D   6257
C   6253
6   6250
1   6245
F   6227
5   6181
2   6162
0   6114
B   6102

Если разделить количество наименее часто встречающегося символа на количество наиболее часто встречающегося - получим 0.957476855484073, т.е. около 4%.

Вам решать насколько это "нормальное" распределение... ;)

→ Ссылка