Algs4-1.1.35模拟投骰子

1.1.35模拟投骰子。以下代码能够计算每两个骰子之和的准确概率分布:
public class Test
{
    public static void main(String[] args)
    {
        int SIDES=6;
        double[] dist=new double[2*SIDES+1];
        for (int i=1;i<=SIDES;i++)
            for (int j=1;j<=SIDES;j++)
                 dist[i+j]+=1.0;
       
        for (int k=2;k<=2*SIDES;k++)
            dist[k]/=36.0;
        
    }
 }
dist[i]的值就是两个骰子之和为i的概率。用实验模拟N次掷骰子,并在计算两个1到6之间的随机整数之和时记录每个值的出现频率以验证它们的概率。N要多大才能够保证你的经验数据和准确数据的吻合程度达到小数点后三位?
解:约10^8次
public class Test
{
    public static void main(String[] args)
    {
     
        int SIDES=6;
        //二维数组,第一维用来存两个骰子掷出的点数和,第二维的1元素存理论概率,第二维的2元素存已掷到的次数,第二维的3元素存实际概率
        double[][] dist=new double[2*SIDES+1][3];
        for (int i=1;i<=SIDES;i++)
            for (int j=1;j<=SIDES;j++)
                 dist[i+j][0]+=1.0;
       //
        for (int k=2;k<=2*SIDES;k++)
            dist[k][0]/=36.0;
       //
        int N=0;
        int dist1;
        int dist2;
       //isOK=true时表示实际概率满足精度要求
        boolean isOK=false;
       while (!isOK)
        {
         N++;
         dist1=StdRandom.uniform(1,SIDES+1);
         dist2=StdRandom.uniform(1,SIDES+1);
         dist[dist1+dist2][1]++;
         dist[dist1+dist2][2]=dist[dist1+dist2][1]/N;
         //
         isOK=true;
         //所有点数和的实际概率都满足精度时才视为满足精度
         for(int i=2;i<=2*SIDES;i++)
         {
             if (Math.abs(dist[i][0]-dist[i][2])>=0.0001)
             {
                 isOK=false;
                 break;
             }  
         }//end for
       }//end while
       StdOut.printf("Limt times is %d",N);
   }
}

原文地址:https://www.cnblogs.com/longjin2018/p/9848732.html

时间: 2024-10-09 01:25:09

Algs4-1.1.35模拟投骰子的相关文章

【算法】模拟掷骰子

模拟掷骰子.以下代码能够计算每种两个骰子之和的准确概率分布: int SIDES = 6; double[] dist = new double[2*SIDES+1]; for (int i = 1; i <= SIDES; i++) for (int j = 1; i <= SIDES; j++) dist[i+j] += 1.0; for (int k = 2; k <= 2*SIDES; k++) dist[k] /= 36.0; dist[i] 的值就是两个骰子之和为i的概率.用

投骰子的随机游戏

投骰子的随机游戏 每个骰子有六面,点数分别为1.2.3.4.5.6.游戏者在程序开始时输入一个无符号整数,作为产生随机数的种子. 每轮投两次骰子,第一轮如果和数为7或11则为胜,游戏结束:和数为2.3或12则为负,游戏结束:和数为其它值则将此值作为自己的点数,继续第二轮.第三轮...直到某轮的和数等于点数则取胜,若在此前出现和数为7则为负. 投骰子需要一个能模拟产生随机数的函数,#include <cstdlib> 中的 int rand(void) 函数是C++库中自带的产生并返回一个伪随机

2017华为机试题--投骰子问题

题目描述:骰子是一个立方体,每个面一个数字,初始为左1,右2,前3(观察者方向),后4,上5,下6,用123456表示这个状态,放置到平面上,可以向左翻转(用L表示向左翻转1次),可以向右翻转(用R表示向右翻转1次),可以向前翻转(用F表示向前翻转1次),可以向后翻转(用B表示向右翻转1次),可以逆时针旋转(用A表示逆时针旋转90度),可以顺时针旋转(用C表示逆时针旋转90度),现从初始状态开始,根据输入的动作序列,计算得到最终的状态. 输入描述: 初始状态为:123456 输入只包含LRFBA

投骰子

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>骰子</title> <style type="text/css"> .sbing{ -webkit-perspective: 800; -webkit-perspective: 50% 50%;} #cube{ -webki

使用Pygal模拟掷骰子

在本节中,将使用Python可视化包Pygal来生成可缩放的矢量图形文件. 对于需要在尺寸不同的屏幕上显示的图表,这很有用,因为它们将自动缩放,以适合观看者的屏幕. 1.创建Die类 from random import randint class Die(): def __init__(self,num_sides=6): self.num_sides=num_sides def roll(self): return randint(1,self.num_sides) 2.分析1000次结果

一个投骰子的小游戏

下午学着做了一个掷骰子的小游戏,感觉比较好玩.用到了自定义函数,循环和选择等知识. 还有刚开始做的时候一个简单版(第1个小板凳) 原文地址:https://www.cnblogs.com/wentian24/p/9280747.html

数据结构与算法之模拟算法 C++实现

模拟算法:模拟整个过程,通过改变数学中模型的各种参数,进而观察变更这些参数所引起过程状态的变化. 算法思路:使用随机函数来模拟自然界中发生的不可预测情况.(srand() 和 rand()函数生成随机数) 模拟算法也就是将整个过程完完整整的走一遍,题目怎么叙述的,程序就怎么运行. 实例一:猜数字 计算机随机生成一个1-100的整数,用户猜测,每次猜测给出不同的提示. 代码: #include <iostream> #include <stdlib.h> #include <t

模拟算法

在程序设计语言中,可以使用随机函数来模拟自然界中发生的不可预测的情况.C语言中使用srand()函数和rand()函数可以生成随机数.使用这两个函数需要包含time.h头文件. 实例一,猜数字游戏.使用模拟算法编写一个猜数字游戏,由计算机随机生成一个1-100之内的整数,然后由用户来猜这个数,根据用户猜测的次数分别给出不同的提示文字. #include <time.h> #include <stdio.h> int main(void){ int n, m, i = 0;//m是用

从中心极限定理的模拟到正态分布

从中心极限定理的模拟到正态分布 2010/05/09优化与模拟.推荐文章.统计图形.统计推断R语言.SAS.Shapiro检验.中心极限定理.动画.密度曲线.数学假设条件.样本均值.样本量.正态分布.泰勒展开.直方图.统计模拟.钟形曲线.随机变量谢益辉 昨日翻看朱世武老师的<金融计算与建模>幻灯片(来源,幻灯片“13随机模拟基础”),其中提到了中心极限定理(Central Limit Theorem,下文简称CLT)及其SAS模拟实现.由于我一直觉得我们看到的大多数对CLT的模拟都有共同的误导