Post
Topic
Board Майнеры
Re: BtcPool.ru
by
vernik
on 21/09/2011, 19:53:49 UTC
Итак, новый алгоритм определения победителя придуман. Хочу узнать ваше мнение  Smiley
Покажу его действие сразу на примере.
Имеется 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
25000/15180 = 0,329380764
1444/15180 = 0,00289855
1333/15180 = 0,002173913
1522/15180 = 0,001449275
920/15180 = 0,001317523
615/15180 = 0,000988142
1112/15180 = 0,000790513
1011/15180 = 0,000724637
510/15180 = 0,000658761
45/15180 = 0,00032938
124/15180 = 0,000263504
73/15180 = 0,000197628
82/15180 = 0,000131752
31/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-ти блоках.


Жду ваших отзывов Wink