Итак, новый алгоритм определения победителя придуман. Хочу узнать ваше мнение
Покажу его действие сразу на примере.
Имеется 15 пользователей (слева номер пользователя, спарава кол-во шар за раунд):
id шары1 - 10000 шар
2 - 5000 шар
3 - 1 шара
4 - 5 шара
5 - 10 шар
6 - 15 шар
7 - 3 шары
8 - 2 шары
9 - 20 шар
10 - 11 шар
11 - 12 шар
12 - 4 шары
13 - 33 шары
14 - 44 шары
15 - 22 шары
всего шар = 15180
Для начала составим столбец коэффициентов каждого пользователя k = (кол-во шар)/(общее кол-во шар) по убыванию
id | k |
1 | 10000/15180 = 0,658761528 |
2 | 5000/15180 = 0,329380764 |
14 | 44/15180 = 0,00289855 |
13 | 33/15180 = 0,002173913 |
15 | 22/15180 = 0,001449275 |
9 | 20/15180 = 0,001317523 |
6 | 15/15180 = 0,000988142 |
11 | 12/15180 = 0,000790513 |
10 | 11/15180 = 0,000724637 |
5 | 10/15180 = 0,000658761 |
4 | 5/15180 = 0,00032938 |
12 | 4/15180 = 0,000263504 |
7 | 3/15180 = 0,000197628 |
8 | 2/15180 = 0,000131752 |
3 | 1/15180 = 0,000065876 |
Хеш, найденного блока (смотрим в
блокэклорере) на данное время, = "00000000000001C688E17BC1CF8FE5E0F1CA128A8FB5F90480F531D0A535FA95"
Берём
функцию md5 от хеша блока. MD5(хеш) = a575dda44b54dc904cd5ab6ace521b34
Переводим в десятичное число (hexademical to demical). Получим 219934613466214688622020642200420064800.
Делим на 10^38. Получается 2,19934613466214688622020642200420064800.
Отбрасываем целую часть. Будет 0,19934613466214688622020642200420064800 (0,199346134).
Таким образом мы получили случайное число от 0 до 1 из хеша найденного блока.
Теперь последовательно снизу-вверх вычитаем коэффициенты из случайного числа, до тех пор пока разность не будет меньше, либо равной нулю:
0,199346134-0,000065876 = 0,199280258 (>0)
0,199280258-0,000131752 = 0,199148506 (>0)
0,199148506-0,000197628 = 0,198950878(>0)
0,198950878-0,000263504 = 0,198687374(>0)
0,198687374-0,00032938 = 0,198357994(>0)
0,198357994-0,000658761 = 0,197699233(>0)
0,197699233-0,000724637 = 0,196974596(>0)
0,196974596-0,000790513 = 0,196184083(>0)
0,196184083-0,000988142 = 0,195195941(>0)
0,195195941-0,001317523 = 0,193878418(>0)
0,193878418-0,001449275 = 0,192429143(>0)
0,192429143-0,002173913 = 0,19025523(>0)
0,19025523-0,00289855 = 0,18735668(>0)
0,18735668-0,329380764 =
-0,142024084(<=0) - Первое место пользователь id = 2 (5000шар)
Теперь удаляем пользователя из самой первой таблицы (его шары), пересчитываем значение всех отправленных шар. Строим заново таблицу коэффициентов. Берём функцию md5 от предыдущего значения функции md5 (будет md5("a575dda44b54dc904cd5ab6ace521b34")=bd8874cc373a099fd5c7954cbb37c565)
Таким образом определятся 11 первых мест.
P.S. случайное число достаточно равномерно распределяется в промежутке от 0 до 1. Проверено на 50-ти блоках.Жду ваших отзывов