I came across an interesting online blackjack game and was hoping someone could help me run the numbers on it or at least point me in the right direction.
It’s a standard infinite deck blackjack game with the following rules:
- Dealer stands on soft 17 (S17)
- Double after split is allowed (DAS)
- No resplits
- Split Aces get only one card, no hitting
But it has some odd gameplay "improvements"
The player has a 1% chance to draw a Joker, which instantly wins the hand.
The player also has a 2.5% chance to draw a Gold card, which doubles the payout on any winning hand (blackjack included).
(And a chance for both at a .025% chance to receive a 2x payout instantly).
Which obviously would be enough to beat this game However:
Hidden in their provably fair page, I found that the dealer has a 9% chance preflop to be dealt a strong starting hand, specifically:
Hand Type | Chance |
---|---|
Ace-10 (Blackjack) | 2% |
10-10 | 3% |
9-10 | 2% |
8-Ace | 2% |
Otherwise they are simply dealt from the randomly generated list of cards.
I’m trying to figure out how much this actually affects the player's overall chances of winning. I assume these mechanics would lead to some optimal strategy adjustments that basic strategy wouldn't account for, as well as a significantly higher house edge then one might assume.
Thanks for anyone who bothered to read this and for any help you can provide :)
Quote: topdoggerHello everyone,
I came across an interesting online blackjack game and was hoping someone could help me run the numbers on it or at least point me in the right direction.
It’s a standard infinite deck blackjack game with the following rules:
- Dealer stands on soft 17 (S17)
- Double after split is allowed (DAS)
- No resplits
- Split Aces get only one card, no hitting
But it has some odd gameplay "improvements"
The player has a 1% chance to draw a Joker, which instantly wins the hand.
The player also has a 2.5% chance to draw a Gold card, which doubles the payout on any winning hand (blackjack included).
(And a chance for both at a .025% chance to receive a 2x payout instantly).
Which obviously would be enough to beat this game However:
Hidden in their provably fair page, I found that the dealer has a 9% chance preflop to be dealt a strong starting hand, specifically:
Hand Type Chance Ace-10 (Blackjack) 2% 10-10 3% 9-10 2% 8-Ace 2%
Otherwise they are simply dealt from the randomly generated list of cards.
I’m trying to figure out how much this actually affects the player's overall chances of winning. I assume these mechanics would lead to some optimal strategy adjustments that basic strategy wouldn't account for, as well as a significantly higher house edge then one might assume.
Thanks for anyone who bothered to read this and for any help you can provide :)
link to original post
Welcome to the forum. In infinite deck the dealer would be dealt A-10 2/169 hands. Is it increased to EXACTLY 2/100? Or is it 2/100 PLUS it’s ‘random’ chance if the ‘magic’ 2/100 does not happen?
Definitely could see some small adjustments needed for a new ‘basic strategy’.
It just seems slimy. It doesn’t mimic a ‘normal deal’ of the cards. I know I would never trust it to be fair.
Quote: SOOPOOQuote: topdoggerHello everyone,
I came across an interesting online blackjack game and was hoping someone could help me run the numbers on it or at least point me in the right direction.
It’s a standard infinite deck blackjack game with the following rules:
- Dealer stands on soft 17 (S17)
- Double after split is allowed (DAS)
- No resplits
- Split Aces get only one card, no hitting
But it has some odd gameplay "improvements"
The player has a 1% chance to draw a Joker, which instantly wins the hand.
The player also has a 2.5% chance to draw a Gold card, which doubles the payout on any winning hand (blackjack included).
(And a chance for both at a .025% chance to receive a 2x payout instantly).
Which obviously would be enough to beat this game However:
Hidden in their provably fair page, I found that the dealer has a 9% chance preflop to be dealt a strong starting hand, specifically:
Hand Type Chance Ace-10 (Blackjack) 2% 10-10 3% 9-10 2% 8-Ace 2%
Otherwise they are simply dealt from the randomly generated list of cards.
I’m trying to figure out how much this actually affects the player's overall chances of winning. I assume these mechanics would lead to some optimal strategy adjustments that basic strategy wouldn't account for, as well as a significantly higher house edge then one might assume.
Thanks for anyone who bothered to read this and for any help you can provide :)
link to original post
Welcome to the forum. In infinite deck the dealer would be dealt A-10 2/169 hands. Is it increased to EXACTLY 2/100? Or is it 2/100 PLUS it’s ‘random’ chance if the ‘magic’ 2/100 does not happen?
Definitely could see some small adjustments needed for a new ‘basic strategy’.
It just seems slimy. It doesn’t mimic a ‘normal deal’ of the cards. I know I would never trust it to be fair.
link to original post
I. Can’t. Wait. To find out where this game is located.
function* randomFloatGenerator(mod) {
const segmentSize = 8;
let hashIndex = 0;
while (true) {
const currentHash = sha512(`${mod}-${hashIndex++}`);
for (let cursor = 0; cursor <= 128 - segmentSize; cursor += segmentSize) {
const segment = ice(cursor, cursor + segmentSize);
yield parseInt(segment, 16) / 16 ** segmentSize;
}
}
}
function pickOne(generator, arr) {
const rand = xt().value;
return arr[Math.floor(rand * arr.length)];
}
function shuffle(generator, arr) {
const result = ice();
for (let i = result.length - 1; i > 0; i--) {
const j = xt().value * (i + 1));
[result[i], result[j]] = [result[j], result[i]];
}
return result;
}
function onVerify() {
const serverSeed = im();
const clientSeed = im();
const nonce = im();
const displayResult = (success, message) => {
nerHTML = `
<div class="${success ? "success" : "error"}">${message}</div>`;
};
if (!/^[a-fA-F0-9]{64}$/.test(serverSeed)) {
displayResult(false, "Please enter a valid 64-character hex server seed.");
return;
}
if (!clientSeed || !nonce) {
displayResult(false, "Please enter both Client Seed and Nonce.");
return;
}
const mod = `${serverSeed}-${clientSeed}-${nonce}`;
const generator = randomFloatGenerator(mod);
const { joker, gold, randomPair } = provablyFairHeaders(generator);
let cardIndex = 0;
const getNextCard = ({ isGold, isJoker }) => {
let card = pickOne(generator, cards);
if (isJoker) card = "Joker";
else if (randomPair && [1, cludes(cardIndex)) {
card = randomPair[cardIndex === 1 ? 0 : 1];
}
return { card, isGold, i: cardIndex++ };
};
const results = om({ length: 50 }, (_, i) =>
getNextCard({
isGold: [0, cludes(i) && gold,
isJoker: i === 2 && joker
})
p(
(e) =>
`<div>
rd}
${[0, cludes(e.i) ? "(player)" : ""}
${[1, cludes(e.i) ? "(dealer)" : ""}
</div>`
);
displayResult(
true,
`<strong>Result:</strong>
<div in("")}</div><br />
<strong>Hashed Server Seed:</strong><br />
<input value="${sha256(serverSeed)}" disabled />`
);
}
function provablyFairHeaders(generator) {
const joker = xt().value <= 0.01;
const gold = xt().value <= 0.025;
const jokerOnSplit = xt().value <= 0.01;
const goldOnSplit = xt().value <= 0.025 || gold;
const pairChance = xt().value;
let randomPair = null;
const pickPair = (a, b) =>
shuffle(
generator,
[a, p((val) =>
pickOne(
generator,
lter((card) => cardValues[card] === val)
)
)
);
if (pairChance < 2) randomPair = pickPair(11, 10);
else if (pairChance < 5) randomPair = pickPair(10, 10);
else if (pairChance < 7) randomPair = pickPair(9, 10);
else if (pairChance < 9) randomPair = pickPair(8, 11);
return { joker, gold, jokerOnSplit, goldOnSplit, randomPair };
}
const cardValues = {
"Two♦": 2,
"Two♥": 2,
"Two♠": 2,
"Two♣": 2,
"Three♦": 3,
"Three♥": 3,
"Three♠": 3,
"Three♣": 3,
"Four♦": 4,
"Four♥": 4,
"Four♠": 4,
"Four♣": 4,
"Five♦": 5,
"Five♥": 5,
"Five♠": 5,
"Five♣": 5,
"Six♦": 6,
"Six♥": 6,
"Six♠": 6,
"Six♣": 6,
"Seven♦": 7,
"Seven♥": 7,
"Seven♠": 7,
"Seven♣": 7,
"Eight♦": 8,
"Eight♥": 8,
"Eight♠": 8,
"Eight♣": 8,
"Nine♦": 9,
"Nine♥": 9,
"Nine♠": 9,
"Nine♣": 9,
"Ten♦": 10,
"Ten♥": 10,
"Ten♠": 10,
"Ten♣": 10,
"Jack♦": 10,
"Jack♥": 10,
"Jack♠": 10,
"Jack♣": 10,
"Queen♦": 10,
"Queen♥": 10,
"Queen♠": 10,
"Queen♣": 10,
"King♦": 10,
"King♥": 10,
"King♠": 10,
"King♣": 10,
"Ace♦": 11,
"Ace♥": 11,
"Ace♠": 11,
"Ace♣": 11
};
const cards = ys(cardValues);
(edit - formatting -D)
I don't have the answer to your OQ.Quote: topdoggerSure but without taking that into account does this game appear to be beatable with the information I am giving? Not every casino needs to rig it if they can have a significant edge like I assume they have here
link to original post
Even if you were confident in the randomness I would be worried if the casino would pay.
I have found many situations online that offered great +EV percentages however they don't pay once you start winning more than 1k or so.
...lol they gave you the exact hash's they're using as well as the variable names for the index, and don't expect someone to hack their site?Quote: topdoggerThis is how it works according to their own provably fair (sorry I cant link or quote this until I post 20 times).
function* randomFloatGenerator(mod) {
const segmentSize = 8;
let hashIndex = 0;
while (true) {
const currentHash = sha512(`${mod}-${hashIndex++}`);
for (let cursor = 0; cursor <= 128 - segmentSize; cursor += segmentSize) {
const segment = ice(cursor, cursor + segmentSize);
yield parseInt(segment, 16) / 16 ** segmentSize;
}
}
}
function pickOne(generator, arr) {
const rand = xt().value;
return arr[Math.floor(rand * arr.length)];
}
function shuffle(generator, arr) {
const result = ice();
for (let i = result.length - 1; i > 0; i--) {
const j = xt().value * (i + 1));
[result[i], result[j]] = [result[j], result[i]];
}
return result;
}
function onVerify() {
const serverSeed = im();
const clientSeed = im();
const nonce = im();
const displayResult = (success, message) => {
nerHTML = `
<div class="${success ? "success" : "error"}">${message}</div>`;
};
if (!/^[a-fA-F0-9]{64}$/.test(serverSeed)) {
displayResult(false, "Please enter a valid 64-character hex server seed.");
return;
}
if (!clientSeed || !nonce) {
displayResult(false, "Please enter both Client Seed and Nonce.");
return;
}
const mod = `${serverSeed}-${clientSeed}-${nonce}`;
const generator = randomFloatGenerator(mod);
const { joker, gold, randomPair } = provablyFairHeaders(generator);
let cardIndex = 0;
const getNextCard = ({ isGold, isJoker }) => {
let card = pickOne(generator, cards);
if (isJoker) card = "Joker";
else if (randomPair && [1, cludes(cardIndex)) {
card = randomPair[cardIndex === 1 ? 0 : 1];
}
return { card, isGold, i: cardIndex++ };
};
const results = om({ length: 50 }, (_, i) =>
getNextCard({
isGold: [0, cludes(i) && gold,
isJoker: i === 2 && joker
})
p(
(e) =>
`<div>
rd}
${[0, cludes(e.i) ? "(player)" : ""}
${[1, cludes(e.i) ? "(dealer)" : ""}
</div>`
);
displayResult(
true,
`<strong>Result:</strong>
<div in("")}</div><br />
<strong>Hashed Server Seed:</strong><br />
<input value="${sha256(serverSeed)}" disabled />`
);
}
function provablyFairHeaders(generator) {
const joker = xt().value <= 0.01;
const gold = xt().value <= 0.025;
const jokerOnSplit = xt().value <= 0.01;
const goldOnSplit = xt().value <= 0.025 || gold;
const pairChance = xt().value;
let randomPair = null;
const pickPair = (a, b) =>
shuffle(
generator,
[a, p((val) =>
pickOne(
generator,
lter((card) => cardValues[card] === val)
)
)
);
if (pairChance < 2) randomPair = pickPair(11, 10);
else if (pairChance < 5) randomPair = pickPair(10, 10);
else if (pairChance < 7) randomPair = pickPair(9, 10);
else if (pairChance < 9) randomPair = pickPair(8, 11);
return { joker, gold, jokerOnSplit, goldOnSplit, randomPair };
}
const cardValues = {
"Two♦": 2,
"Two♥": 2,
"Two♠": 2,
"Two♣": 2,
"Three♦": 3,
"Three♥": 3,
"Three♠": 3,
"Three♣": 3,
"Four♦": 4,
"Four♥": 4,
"Four♠": 4,
"Four♣": 4,
"Five♦": 5,
"Five♥": 5,
"Five♠": 5,
"Five♣": 5,
"Six♦": 6,
"Six♥": 6,
"Six♠": 6,
"Six♣": 6,
"Seven♦": 7,
"Seven♥": 7,
"Seven♠": 7,
"Seven♣": 7,
"Eight♦": 8,
"Eight♥": 8,
"Eight♠": 8,
"Eight♣": 8,
"Nine♦": 9,
"Nine♥": 9,
"Nine♠": 9,
"Nine♣": 9,
"Ten♦": 10,
"Ten♥": 10,
"Ten♠": 10,
"Ten♣": 10,
"Jack♦": 10,
"Jack♥": 10,
"Jack♠": 10,
"Jack♣": 10,
"Queen♦": 10,
"Queen♥": 10,
"Queen♠": 10,
"Queen♣": 10,
"King♦": 10,
"King♥": 10,
"King♠": 10,
"King♣": 10,
"Ace♦": 11,
"Ace♥": 11,
"Ace♠": 11,
"Ace♣": 11
};
const cards = ys(cardValues);
link to original post
Also, how did you obtain that code? it's just sitting on their site??
Quote: topdoggerits in the provably fair section of the site
link to original post
At first, I thought you were mistyping “probable”, but I now realize that provable is “that which can be proven”.
I don’t have an opinion one way or another regarding the voracity of this gaming site. I believe that AxelWolf has had a great many dealings with a myriad of gambling sites, both good and bad… If he smells a rat, there’s “provably” a rat!
[ETA] That being said, I’m curious as well what the HE turns out to be…
Quote: ThatDonGuyThere's an unclosed tag in this thread - apparently near the top - that's causing ads to cover most of the replies
link to original post
Sorry. Code snippet had some variable references that looked like
italic tags.
I saw it, but didn't dive in proactively.
Styling fixed in original and quote, let me know if it's insufficient.
The forum has support for special meta tags [[] and []], which are specifically useful for array variables with an index of i.