Рандомайзер для колоды карт

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Рандомайзер для колоды карт

Сообщение kibernetics » 24.05.2019 (Пт) 2:08

Приветствую форумчан!

У меня тут мысль одна возникла,
в общем, интересует такой вопрос, как лучше организовать рандомный генератор колоды карт из 52шт.?
Хотелось бы сделать такой, чтобы не зависел от системы. Т.е. чтобы не было повторений от генератора.
Достаточно ли задействовать тот, что предлагал Mikle http://bbs.vbstreets.ru/viewtopic.php?f=1&t=17755&p=135910&hilit=RandInit#p135910 ?

И как бы это грамотно сделать:
а) получать значение, затем снова запрашивать генерацию до тех пор, пока оно не станет равным тем, которые ранее уже уже были получены?
б) или же может можно генерировать некое длиннющее число, которое бы соответствовало определённому набору колоды? Но тогда это не фиговое число должно быть, так как всего комбинаций 52! (факториал), что равносильно числу примерно с 80 нулями, вроде как. :roll:

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Рандомайзер для колоды карт

Сообщение Mikle » 24.05.2019 (Пт) 10:39

kibernetics писал(а):Хотелось бы сделать такой, чтобы не зависел от системы. Т.е. чтобы не было повторений от генератора.

Этот генератор будет нормально работать везде, где есть Double и Single, но вот совпадений не гарантируется, то есть при одном и том же Seed на разных системах может получиться разная последовательность, иногда последний знак при float вычислениях отличается, например, такое наблюдалось на процессорах AMD до Athlon. Возможно, будет на каком-нибудь ARM.
Но на качество это не повлияет.
kibernetics писал(а):И как бы это грамотно сделать

Цикл:
1. Выбираем случайную карту из набора
2. Убираем эту карту из набора
3. Если набор не пустой - Goto 1

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Re: Рандомайзер для колоды карт

Сообщение kibernetics » 29.05.2019 (Ср) 18:58

Так, шафл взял из примера Кнута ' Knuth shuffle
сам шафл:
' Knuth shuffle (very fast)
Код: Выделить всё
Public Sub ShuffleArray(pvarArray As Variant)
    Dim i As Long
    Dim iMin As Long
    Dim iMax As Long
    Dim lngReplace As Long
    Dim varSwap As Variant
   
    iMin = LBound(pvarArray)
    iMax = UBound(pvarArray)
    For i = iMax To iMin + 1 Step -1
        lngReplace = Int((i - iMin + 1) * Rnd + iMin)
        varSwap = pvarArray(i)
        pvarArray(i) = pvarArray(lngReplace)
        pvarArray(lngReplace) = varSwap
    Next
End Sub
вызов:
Код: Выделить всё
Private Sub DrawCards()
    Dim lngCards(51) As Long
    Dim lngCurrent As Long
    Dim i As Long
   
    ' инициализация колоды
    lngCurrent = 0
    For i = 0 To 51
        lngCards(i) = i
    Next
    ' перемешиваем
    ShuffleArray lngCards
    ' выводим 40 карт
    For i = 1 To 40
        Debug.Print lngCards(lngCurrent)
        lngCurrent = lngCurrent + 1
    Next
End Sub


А вот теперь, прошу помочь разобраться с определениями игры на руках из 5-6 карт.
И для того чтобы не расписывать таблицы и хранить там варианты игр, есть метод битовых сдвигов. Однако, пример, который я нашёл, набросан в js, и есть неясности.
Его описание приводится здесь: Hand-analyzer-in-JavaScript-using-bit-math
Сразу там понятно, передаётся 2 массива с битами карт. А потом пошла неразбериха, если честно, в ход пошли корни квадратные, битовые сдвиги... неразобрать, например:
for (i=-1, v=o=0; i<5; i++, o=Math.pow(2,cs[i]*4)) {v += o*((v/o&15)+1);}

Просьба помочь, кто чем может :?


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 4

    TopList