骰子赔率:模拟掷骰子游戏

     2023-03-14     102

关键词:

【中文标题】骰子赔率:模拟掷骰子游戏【英文标题】:Dice odds: Simulating a game of Craps 【发布时间】:2011-01-19 12:37:14 【问题描述】:

我的兄弟几周后就 21 岁了,我和父母要带他去拉斯维加斯。在我 21 岁的时候,我带了 200 美元去维加斯赌博,然后带着大约 450 美元回家,大部分来自玩掷骰子。我计划为这次旅行再次带上 200 美元,在我去之前,我想我会进行一些掷骰子模拟,看看我是否可以再次将我的钱翻倍。

我从多个来源了解到,在以最大赔率下注时,赌场在掷骰子上的优势最小。根据我的记忆,以及Wizard of Odds 的调查,拉斯维加斯大道上的大多数赌场都是 3-4-5 赔率,最低 5 美元。考虑到这一点,这里是用 PHP 模拟的掷骰子会话(100 次掷骰子):

<?php

$stash = 200;
$bet = 5;

for($i=100; $i--;) 

    $dice1 = mt_rand(1, 6);
    $dice2 = mt_rand(1, 6);
    $total = $dice1 + $dice2;

    if(!$button) 
        if($total===7 || $total===11) 
            $stash += $bet;
        
        elseif($total===2 || $total===3 || $total===12) 
            $stash -= $bet;
        
        else 
            $button = $total;
            if($total===4 || $total===10) 
                $odds = $bet*3;
            
            elseif($total===5 || $total===9) 
                $odds = $bet*4;
            
            elseif($total===6 || $total===8) 
                $odds = $bet*5;
            
        
    
    else 
        if($total===7) 
            $button = 0;
            $stash -= ($bet + $odds);
        
        elseif($total===$button) 
            $button = 0;
            $stash += $bet;
            if($total===4 || $total===10) 
                $stash += $odds*2/1;
            
            elseif($total===5 || $total===9) 
                $stash += $odds*3/2;
            
            elseif($total===6 || $total===8) 
                $stash += $odds*6/5;
            
        
    

    echo 'Stash: $'.$stash.'<br/>';



?>

我的数学有什么问题吗?虽然每个时段都有高峰和低谷,但这种模拟通常会在破产之前将其资金翻倍。考虑到房子在掷骰子时总是有优势,即使只是百分之几,我对这个结果感到困惑。

【问题讨论】:

【参考方案1】:

我会小心编写任何代码以“证明”在您破产之前,您更有可能在掷骰子(或任何其他机会游戏)上加倍您的钱。拉斯维加斯是内华达州沙漠中一座庞大的城市,这证明了两件事:

    最终,房子总是赢 人们数学不好

任何赌场都不会在不利用这两个规则的情况下投放任何游戏。如果你的代码不同意 Vegas,我会把钱放在 Vegas。

更新:

这是我根据您的原始代码编写的一些 C++。您发布的最初问题是,您是否可以在破产之前将钱翻倍。我跟进了我写的代码,得到了一些结果。

#include <iostream>

int die_roll()

    return std::rand() % 6 + 1;


int win_count_g(0);
int loss_count_g(0);

// return true when double our money.
// return false when we can't bet anymore.
bool test_loop(int cash)

    static const int bet_k(5);

    int goal(cash * 2);
    int button(0);

    while (true)
    
        if (cash >= goal)
            return true;
        else if (cash < bet_k)
            return false;

        int roll(die_roll() + die_roll());
        int odds(0); // additional odds bet

        if (button == 0)
        
            if (roll == 7 || roll == 11)
            
                ++win_count_g;
                cash += bet_k;
            
            else if (roll == 2 || roll == 3 || roll == 12)
            
                ++loss_count_g;
                cash -= bet_k;
            
            else
            
                button = roll;

                if (roll == 4 || roll == 10)
                
                    odds = std::min(cash - bet_k, bet_k * 3);
                
                else if (roll == 5 || roll == 9)
                
                    odds = std::min(cash - bet_k, bet_k * 4);
                
                else // if (roll == 6 || roll == 8)
                
                    odds = std::min(cash - bet_k, bet_k * 5);
                
            
        
        else
        
            if (roll == 7)
            
                ++loss_count_g;
                button = 0;
                cash -= bet_k + odds;
            
            else if (roll == button)
            
                ++win_count_g;
                button = 0;
                cash += bet_k;

                if (roll == 4 || roll == 10)
                
                    cash += odds * 2;
                
                else if (roll == 5 || roll == 9)
                
                    cash += odds * 3 / 2;
                
                else // if (roll == 6 || roll == 8)
                
                    cash += odds * 6 / 5;
                
            
        
    


void test(int cash)

    win_count_g = 0;
    loss_count_g = 0;

    int doubled(0);
    int broke(0);

    for (int i(0); i < 10000; ++i)
        if (test_loop(cash))
            ++doubled;
        else
            ++broke;

    float win_percentage(static_cast<float>(doubled) / (doubled + broke) * 100.0);

    std::cout << "starting cash: $" << cash
              << "; doubled: " << doubled
              << "; broke: " << broke
              << " (" << win_percentage << "% win)"
              << "; loop wins: " << win_count_g
              << "; loop losses: " << loss_count_g
              << std::endl;


int main ()

    static const int cash_set_k[] =
    
        5,
        10,
        20,
        50,
        100,
        200,
        400,
        800,
        1000
    ;
    static const int cash_set_size_k(sizeof(cash_set_k) / sizeof(cash_set_k[0]));

    std::for_each(&cash_set_k[0], &cash_set_k[cash_set_size_k], &test);

    return 0;

结果:

starting cash: $5; doubled: 4944; broke: 5056 (49.44% win); loop wins: 4944; loop losses: 5056
starting cash: $10; doubled: 4862; broke: 5138 (48.62% win); loop wins: 19706; loop losses: 20258
starting cash: $20; doubled: 4755; broke: 5245 (47.55% win); loop wins: 78360; loop losses: 80320
starting cash: $50; doubled: 4345; broke: 5655 (43.45% win); loop wins: 489406; loop losses: 502506
starting cash: $100; doubled: 3553; broke: 6447 (35.53% win); loop wins: 1914393; loop losses: 1972273
starting cash: $200; doubled: 2468; broke: 7532 (24.68% win); loop wins: 7172464; loop losses: 7375024
starting cash: $400; doubled: 861; broke: 9139 (8.61% win); loop wins: 22615369; loop losses: 23277609
starting cash: $800; doubled: 112; broke: 9888 (1.12% win); loop wins: 54556881; loop losses: 56121041
starting cash: $1000; doubled: 31; broke: 9969 (0.31% win); loop wins: 69308617; loop losses: 71296217

【讨论】:

您的代码看起来和我想出的一样,只是在计算赔率投注时需要考虑初始投注。 IE。 odds = std::min( cash - bet_k, bet_k * 3); 而不是 odds = std::min(cash, bet_k * 3); 谢谢,已更新;有趣的是,我没有看到这种变化对结果有任何影响。这将是拉斯维加斯的一个有趣的吸引力:投注赔率,拉斯维加斯会为您提供最低赔率投注!【参考方案2】:

您并没有检查您是否有足够的钱来下您想要的赔率赌注。实际上,您根本没有检查存储的大小。如果您能够下注,即使您的 stash size 为负数,此模拟也能更频繁地击败赌场,这并不奇怪。

顺便说一句,我对你的 100 次掷骰子的模拟运行了 50,000 次迭代(我修改了剩余的最大赌注)并得出以下结论:

胜:23807

损失:25465

推(你带着 200 美元离开):728

平均。奖金:109.07 美元

【讨论】:

我刚刚意识到的另一件事,您的模拟掷骰子 100 次然后走开,而不考虑桌上还剩多少钱,所以平均奖金和获胜次数应该少一点不止于此。 所以我运行了这个修改过的脚本(50,000 次迭代),并附加了十次“不要把钱留在桌面上”的警告,并得出以下胜率:48.6%、48.1%、48.2% , 48.0%, 47.7%, 48.4%, 48.0%, 48.2%, 48.2%, 47.7%。简而言之:不,你无法击败维加斯。 :)【参考方案3】:

嗯,马上,我可以看出你在简单的 7 或 11 赢的情况下有一个错误:你应该赢你的赌注,而不是你的赌注的两倍。

编辑:我相信赔率投注的支出与实际概率相称。您掷出 7(输掉赔率)的可能性是 10 的两倍,因此当您在 4 或 10 上获胜时,您应该得到 2:1 的报酬;并且仅在您以 6 或 8 获胜时支付 6:5。

【讨论】:

我修改了源代码 - 你现在觉得如何?中奖赔率是否需要调整或模拟是否正确? @Kevin:根据我对掷骰子的理解,我认为您现在已经正确支付了所有款项。但是,其他人给出的答案包含改进和扩展您的模拟的方法。

python掷骰子游戏

...(x):num=int(random.uniform(1,7))return[num,"第"+str(x)+"个骰子摇出来的点数是:"+str(num)+"\n"]deftous(r):sum,constr=0,""#range(r)means0torsousebelowforiinrange(1,r+1):conresult=randstr(i)sum+=conresult[0]constr+=conresult[1]return[sum,constr]de... 查看详情

掷骰子(代码片段)

模拟同时掷1个6面骰子和1个10面骰子10000次,并可视化所得点数的频率,用到pygal库。importpygalfromrandomimportrandintclassDie:"""模拟一个掷骰子的类"""def__init__(self,num_sides=6):"""初始化类的属性"""self.num_sides=num_sidesdefroll(self):"""返回掷骰子... 查看详情

如何在unity3d中掷骰子

1、介绍2、滚一个骰子3、导入模型4、添加脚本5、方法6、识别骰子上的随机面值 客观的这篇文章的主要目的是给你一个关于如何在Unity3D中掷骰子的想法。 第一步介绍1、构建一个棋盘游戏,但对骰子有问题;这里是一个示... 查看详情

无法解析 Android 应用程序中的掷骰子游戏方法

】无法解析Android应用程序中的掷骰子游戏方法【英文标题】:CannotresolvemethodsinAndroidappforgameofcraps【发布时间】:2016-01-1418:30:03【问题描述】:我正在创建一个简单的掷骰子应用程序。我收到此错误:无法解析我的nextInt()方法和v... 查看详情

c语言每日一练——第61天:掷骰子游戏(代码片段)

C语言每日一练2021年11月21日文章目录实现掷骰子小游戏实现原理源码介绍效果展示今日练习题目描述问题分析代码实现运行结果实现掷骰子小游戏在开始今天的练习前,我先写一个有趣的C语言小游戏——掷骰子(zhìtóuzi... 查看详情

使用pygal模拟掷骰子(代码片段)

在本节中,将使用Python可视化包Pygal来生成可缩放的矢量图形文件。对于需要在尺寸不同的屏幕上显示的图表,这很有用,因为它们将自动缩放,以适合观看者的屏幕。1.创建Die类fromrandomimportrandintclassDie():def__init__(self,num_sides=6):s... 查看详情

确定掷骰子中出现的数字的频率

】确定掷骰子中出现的数字的频率【英文标题】:DetermineFrequencyofnumbersshowingupindicerolls【发布时间】:2010-10-0408:12:07【问题描述】:对于一个游戏,我试图确定某个#出现在给定的骰子数时出现的频率。我知道……这个问题似乎很... 查看详情

Unity 掷骰子后让玩家的棋子轮流移动

】Unity掷骰子后让玩家的棋子轮流移动【英文标题】:UnityMakingplayerpiecesmoveinturnsafterrollingdie【发布时间】:2021-08-0304:06:28【问题描述】:我是Unity的新手,我一直在关注并结合教程中的示例,使用本教程中的3d骰子组合一个简单... 查看详情

两个骰子的朴素贝叶斯方法

】两个骰子的朴素贝叶斯方法【英文标题】:NaiveBayesmethodfortwodice【发布时间】:2021-02-2822:19:05【问题描述】:我需要帮助实现-其中一个是具有六个面的“正常”骰子,因此每个面出现1/6的概率相同。另一个是加载的骰子,每次... 查看详情

小学生蓝桥杯python闯关|掷骰子(代码片段)

...都不愿意去打扫厕所,于是聪明的阿明决定用一个掷骰子的游戏来决定,输的人就去打扫厕所。游戏规则为:阿明和阿强分别掷一个骰子,每个骰子的点数为1到6,第1轮掷骰子时,若点数和为2或3,阿... 查看详情

09骰子游戏(代码片段)

骰子游戏我们来玩一个游戏。同时掷出3个普通骰子(6个面上的数字分别是1~6)。如果其中一个骰子上的数字等于另外两个的和,你就赢了。下面的程序计算出你能获胜的精确概率(以既约分数表示)publicclassMainpublicstaticintgcd(int... 查看详情

基础入门题049骰子游戏

...门题】2021.12.15随机生成1~6范围内的三个数字模拟掷三个骰子,三数之和3~10为小;11~18为大。请编制程序,要求输入1或0表示猜大小,记录猜测结果,猜满10次退出并输出结果。编程语言:包括但不限于Python... 查看详情

一个投骰子的小游戏

下午学着做了一个掷骰子的小游戏,感觉比较好玩。用到了自定义函数,循环和选择等知识。还有刚开始做的时候一个简单版(第1个小板凳)  查看详情

我正在尝试制作一个掷骰子应用程序。它可以掷出特定数量的骰子。有没有办法添加这些值?

】我正在尝试制作一个掷骰子应用程序。它可以掷出特定数量的骰子。有没有办法添加这些值?【英文标题】:I\'mtryingtomakeadicethrowingapp.Itcanthrowspecificnumberofdices.Isthereawaytoaddthesevalues?【发布时间】:2021-04-2504:28:11【问题描述】:... 查看详情

json掷骰子即服务(代码片段)

查看详情

json掷骰子即服务(代码片段)

查看详情

尝试随机掷两个骰子并将总和相加直到达到 21

】尝试随机掷两个骰子并将总和相加直到达到21【英文标题】:Attemptingtorolltwodicerandomlyandaddthesumstillitreachestwentyone【发布时间】:2018-09-2803:34:27【问题描述】:我正在尝试编写一个程序,该程序随机掷两个骰子,将它们加在一起... 查看详情

jquery掷骰子

  网上找的jQuery掷骰子效果,测试兼容IE7及以上浏览器,IE6没有测试  js代码如下:1$(function(){2vardice=$("#dice");3dice.click(function(){4$(".wrap").append("<divid=‘dice_mask‘></div>");//加遮罩5dice.attr 查看详情