Продолжение Части 1.

Обзор

Мой первоначальный прототип готов! В этом первом наброске я создал просто систему, которая будет выводить 1000 случайных чисел от 0 до 36. Затем эти числа будут заполнять диаграмму рулетки, показанную выше. В тот момент, когда выпадает каждое число, я также делаю случайную ставку в размере 10 долларов на красное или черное и подсчитываю выигрыши и проигрыши на пути к 1000 бросков с начальным банком в 1000 долларов.

Что я узнал

Эти первые шаги должны быть довольно прямыми, но все же есть несколько неожиданных результатов;

  • Я тестировал в основном с 1000 бросков на набор и использовал случайные ставки, чтобы проверить, все ли в порядке. Что меня действительно удивило, так это то, что я на самом деле получаю положительные результаты по большому количеству сыгранных сетов. Я потратил довольно много времени, пытаясь понять, откуда взялся баг, но на самом деле мне просто очень повезло. 🤷🏻‍ После тестирования с 10 000 роллов и еще парой сетов я вернулся к, казалось бы, более нормальному отрицательному банкроллу.
  • Мое первоначальное предположение заключалось в том, что черный и красный должны выпадать примерно по 48,5% каждый, причем примерно 3% идут в «казино» через зеленый номер 0. Но, кажется, я вижу больше 46–47% в одну сторону. Может быть, это уже начало сбоя «системы»? Я буду тестировать больше с наборами разных размеров, чтобы увидеть, как это повлияет на вещи.

Фрагменты кода

  • Я всегда думал, что номера рулетки были просто черными для нечетных и красными для четных. Но, по-видимому, он разделен на 4 набора чисел и чередует красное и черное между четными и нечетными числами. Таким образом, определить, был ли рулон черным или красным, было немного сложнее, чем я изначально ожидал.
if ( num === 0 ) return ‘green’
if ( ( num >= 1 && num <= 10 ) || ( num >= 19 && num <= 28 ) ) {
  return num % 2 === 0 ? ‘black’ : ‘red’
}
if ( ( num >= 11 && num <= 18 ) || ( num >= 29 && num <= 36 ) ) {
  return num % 2 === 0 ? ‘red’ : ‘black’
}
  • Самый быстрый способ получить мои результаты, безусловно, будет заключаться в том, чтобы разбить все на части в цикле, который работает за кулисами. Но таким образом я не смогу увидеть увеличение числа на экране; теперь в чем прикол? Поэтому я приступил к реализации setTimeout, чтобы мои броски и ставки продолжались. Но я замечаю некоторое мерцание и непоследовательность при анимации… Провел небольшое исследование и нашел этот вопрос Stackoverflow! Вау, я думаю, вы действительно узнаете что-то новое, даже если вы просто делаете случайные бессмысленные проекты. Следовал следующему коду requestAnimationFrame из этой ссылки, чтобы переработать мои анимации. Самое приятное в этом то, что теперь я также могу контролировать частоту кадров, чтобы варьировать скорость роликов. Это, вероятно, пригодится на более поздних этапах, если я захочу генерировать графики или замедлиться, чтобы увеличить масштаб определенных игр, как это происходит. Вот общая суть того, как это работает:
startDraw( fps ) {
   this.int = 1000 / fps
   this.then = Date.now()
   this.draw()
}
draw() {
   if ( this.stop === true ) return
   requestAnimationFrame( this.draw )
   this.now = Date.now()
   this.elapsed = this.now — this.then
   if ( this.elapsed > this.int ) {
     this.then = this.now — ( this.elapsed % this.int )
     // animation & betting stuff goes here
   } else {
     this.stop = true
   }
 }

Следующие шаги

Далее добавлю систему ставок. Поэтому вместо того, чтобы делать ставки случайным образом, как это делается сейчас, я создам наблюдатель, который будет отслеживать красные и черные. Как только 3 или более черных или красных выпадут последовательно, система сделает ставку на противоположный для следующего раунда. В случае проигрыша система увеличит следующую ставку на определенную сумму.

По крайней мере, это теория на данный момент. Я также оставлю случайные ставки в качестве контрольной группы, чтобы мы могли сравнить, регулярно ли система превосходит ее, соответствует ее результатам или оказывается хуже, чем случайные ставки. 🤣

Удачи повеселиться.

www.kelvinzhao.com