topdogger
topdogger
  • Threads: 1
  • Posts: 6
Joined: Jan 15, 2025
Thanked by
Dieter
January 29th, 2025 at 4:55:56 PM permalink
Hello 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:

  1. Dealer stands on soft 17 (S17)
  2. Double after split is allowed (DAS)
  3. No resplits
  4. 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 :)
SOOPOO
SOOPOO
  • Threads: 123
  • Posts: 11665
Joined: Aug 8, 2010
January 30th, 2025 at 4:13:55 AM permalink
Quote: topdogger

Hello 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:

  1. Dealer stands on soft 17 (S17)
  2. Double after split is allowed (DAS)
  3. No resplits
  4. 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.
heatmap
heatmap
  • Threads: 272
  • Posts: 2401
Joined: Feb 12, 2018
January 30th, 2025 at 5:05:43 AM permalink
Quote: SOOPOO

Quote: topdogger

Hello 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:

  1. Dealer stands on soft 17 (S17)
  2. Double after split is allowed (DAS)
  3. No resplits
  4. 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.
topdogger
topdogger
  • Threads: 1
  • Posts: 6
Joined: Jan 15, 2025
January 30th, 2025 at 8:27:34 AM permalink
I trust it to be fair as far as their randomness goes, but it is incredibly sketchy to not inform the user about it. The dealer gets the extra chance of these hands prior to any deck being generated, so 9% of the time they get good hands directly from that random chance, while the other 91% of the time they draw from an infinite deck like normal.
topdogger
topdogger
  • Threads: 1
  • Posts: 6
Joined: Jan 15, 2025
January 30th, 2025 at 8:32:04 AM permalink
This 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);


(edit - formatting -D)
Last edited by: unnamed administrator on Feb 2, 2025
AxelWolf
AxelWolf
  • Threads: 170
  • Posts: 22766
Joined: Oct 10, 2012
Thanked by
Dieter
January 30th, 2025 at 12:08:43 PM permalink
Provably fair isn't what it seems and it's not foolproof. I have been presented with proof of such, there may be some information related to what I'm saying on this forum.
♪♪Now you swear and kick and beg us That you're not a gamblin' man Then you find you're back in Vegas With a handle in your hand♪♪ Your black cards can make you money So you hide them when you're able In the land of casinos and money You must put them on the table♪♪ You go back Jack do it again roulette wheels turinin' 'round and 'round♪♪ You go back Jack do it again♪♪
topdogger
topdogger
  • Threads: 1
  • Posts: 6
Joined: Jan 15, 2025
January 30th, 2025 at 3:46:16 PM permalink
Sure 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
AxelWolf
AxelWolf
  • Threads: 170
  • Posts: 22766
Joined: Oct 10, 2012
January 30th, 2025 at 3:53:34 PM permalink
Quote: topdogger

Sure 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

I don't have the answer to your OQ.

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.
♪♪Now you swear and kick and beg us That you're not a gamblin' man Then you find you're back in Vegas With a handle in your hand♪♪ Your black cards can make you money So you hide them when you're able In the land of casinos and money You must put them on the table♪♪ You go back Jack do it again roulette wheels turinin' 'round and 'round♪♪ You go back Jack do it again♪♪
topdogger
topdogger
  • Threads: 1
  • Posts: 6
Joined: Jan 15, 2025
January 31st, 2025 at 7:00:14 PM permalink
Yeah fair I could see that happening, depends on if they are licensed by curacao or an actual country I suppose
Last edited by: topdogger on Jan 31, 2025
Romes
Romes
  • Threads: 29
  • Posts: 5632
Joined: Jul 22, 2014
January 31st, 2025 at 8:09:07 PM permalink
Quote: topdogger

This 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

...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?

Also, how did you obtain that code? it's just sitting on their site??
Last edited by: unnamed administrator on Feb 2, 2025
Playing it correctly means you've already won.
topdogger
topdogger
  • Threads: 1
  • Posts: 6
Joined: Jan 15, 2025
February 1st, 2025 at 11:26:09 AM permalink
its in the provably fair section of the site
camapl
camapl
  • Threads: 8
  • Posts: 557
Joined: Jun 22, 2010
February 1st, 2025 at 1:41:41 PM permalink
Quote: topdogger

its 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…
It’s a dog eat dog world. …Or maybe it’s the other way around!
gordonm888
Administrator
gordonm888
  • Threads: 61
  • Posts: 5414
Joined: Feb 18, 2015
February 1st, 2025 at 6:57:46 PM permalink
If topdogger wants to send me the link to the site by private message, I will post it in this thread for others to examine.
So many better men, a few of them friends, are dead. And a thousand thousand slimy things live on, and so do I.
ThatDonGuy
ThatDonGuy
  • Threads: 123
  • Posts: 6812
Joined: Jun 22, 2011
Thanked by
camapl
February 1st, 2025 at 7:49:13 PM permalink
There's an unclosed tag in this thread - apparently near the top - that's causing ads to cover most of the replies
Dieter
Administrator
Dieter
  • Threads: 16
  • Posts: 6271
Joined: Jul 23, 2014
February 2nd, 2025 at 1:18:02 AM permalink
Quote: ThatDonGuy

There'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.
May the cards fall in your favor.
  • Jump to: