Является ли NEWID() равномерно распределённой функцией?
Достаточно ли написать в SQL Server 2017
SELECT x FROM y
ORDER BY NEWID()
для того, чтобы быть точно уверенным в том что все созданные значения будут равномерно распределёнными между собой?
Т.к. это GUID v4, то генерация основана на псевдослучайных числах. Но будет ли всё множество созданных чисел NEWID() создано с одинаковой вероятностью или шанс оказаться в каком-то диапазоне чисел отличится от общего?
Если не является, то является ли следующее выражение равномерно распределённым?
SELECT x FROM y
ORDER BY CHECKSUM(NEWID())
Ответы (1 шт):
Вот простенький тестовый 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%.
Вам решать насколько это "нормальное" распределение... ;)