模拟投骰子
2017-03-09 10:46
183 查看
编译语言:java;编译环境:《算法第四版》官网编译器 ,附上地址连接:http://algs4.cs.princeton.edu/windows/
1、首先做了一个模拟投单个骰子随机事件
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.StdRandom;
import edu.princeton.cs.algs4.Counter;
public class Rolls
{
public static void main(String[] args)
{
int T = Integer.parseInt(args[0]); //初始化赋值投掷次数,模拟次数越多越接近理论值
int SIDES = 6; //定义骰子的6个面
Counter[] rolls = new Counter[SIDES+1];
for(int i = 0;i <= SIDES;i++)
{
rolls[i] = new Counter("point:"+i);
}
for(int t = 0;t < T;t++)
{
int result = StdRandom.uniform(1,SIDES+1); //获取1~6中的随机数
rolls[result].increment();
}
for(int i = 1;i <= SIDES;i++)
StdOut.println(rolls[i]);
}
}
运行后的结果如下图所示:
从运行结果可以看出,当模拟次数到达10000次的时候,每个点数出现的频率虽有出入,但是大致接近;如果模拟次数够多就可以无限接近理论值。
2、接下来我们模拟投掷两个骰子,以及各可能点数出现的概率。
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.StdRandom;
public class TwoRolls
{
/*
*投掷两个骰子出现可能点数的理论概率
*/
public static void accurate()
{
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;
StdOut.println("Sum="+k+" probability:"+dist[k]);
}
}
/*
*模拟投掷两个骰子N次,出现可能点数的实际概率
*/
public static void simulation(int N)
{
int SIDES = 6;
double[] dist2 = new double[2*SIDES+1];
for(int i = 0;i < N;i++)
{
int a = StdRandom.uniform(1,7);
int b = StdRandom.uniform(1,7);
dist2[a+b] += 1;
}
for(int k = 2;k <= 2*SIDES;k++)
{
dist2[k] /= N;
StdOut.println("Sum="+k+" simulation:"+dist2[k]);
}
}
public static void main(String[] args)
{
accurate();
StdOut.println("****************************************************");
simulation(1000000);
}
}
经过多次的实验发现,当模拟投掷次数大于10^6时,实验数据概率和准确数据概率吻合程度达到小数点后三位。
1、首先做了一个模拟投单个骰子随机事件
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.StdRandom;
import edu.princeton.cs.algs4.Counter;
public class Rolls
{
public static void main(String[] args)
{
int T = Integer.parseInt(args[0]); //初始化赋值投掷次数,模拟次数越多越接近理论值
int SIDES = 6; //定义骰子的6个面
Counter[] rolls = new Counter[SIDES+1];
for(int i = 0;i <= SIDES;i++)
{
rolls[i] = new Counter("point:"+i);
}
for(int t = 0;t < T;t++)
{
int result = StdRandom.uniform(1,SIDES+1); //获取1~6中的随机数
rolls[result].increment();
}
for(int i = 1;i <= SIDES;i++)
StdOut.println(rolls[i]);
}
}
运行后的结果如下图所示:
从运行结果可以看出,当模拟次数到达10000次的时候,每个点数出现的频率虽有出入,但是大致接近;如果模拟次数够多就可以无限接近理论值。
2、接下来我们模拟投掷两个骰子,以及各可能点数出现的概率。
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.StdRandom;
public class TwoRolls
{
/*
*投掷两个骰子出现可能点数的理论概率
*/
public static void accurate()
{
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;
StdOut.println("Sum="+k+" probability:"+dist[k]);
}
}
/*
*模拟投掷两个骰子N次,出现可能点数的实际概率
*/
public static void simulation(int N)
{
int SIDES = 6;
double[] dist2 = new double[2*SIDES+1];
for(int i = 0;i < N;i++)
{
int a = StdRandom.uniform(1,7);
int b = StdRandom.uniform(1,7);
dist2[a+b] += 1;
}
for(int k = 2;k <= 2*SIDES;k++)
{
dist2[k] /= N;
StdOut.println("Sum="+k+" simulation:"+dist2[k]);
}
}
public static void main(String[] args)
{
accurate();
StdOut.println("****************************************************");
simulation(1000000);
}
}
经过多次的实验发现,当模拟投掷次数大于10^6时,实验数据概率和准确数据概率吻合程度达到小数点后三位。
相关文章推荐
- Uva 810 DFS+骰子模拟
- 【程序12】模拟掷骰子游戏
- 编写函数模拟掷骰子的游戏(两个骰子)。第一次掷的时候,如果点数之和为7或11则获胜;如果点数之和为2、3或12则落败;其他情况下的点数之和称为“目标”,游戏继续。在后续的投掷中,如果玩家再次掷出“目标
- 模拟投掷骰子,一至六点出现的次数…
- C/C++ rand()产生随机数 模拟 掷骰子 小游戏代码
- pygal--模拟投骰子
- 自己用JavaScript写的一个很简单的骰子大小赌博模拟
- C Tricks(八)—— 硬币和骰子的模拟
- 【Python-3.5】Pygal模拟骰子点数,分析结果可视化
- R语言模拟投硬币掷骰子
- python模拟掷骰子
- 模拟掷骰子 Simulating Dice
- 【NOIP2012模拟11.1】骰子游戏
- 模拟掷骰子
- JZOJ3082. 【NOIP2012模拟11.1】骰子游戏
- JZOJ【3072】【NOIP2012模拟10.31】掷骰子
- python语言学习笔记(三)-----模拟投掷三个骰子,对游戏结果进行统计
- 每隔五秒执行一次 共十次 模拟骰子的投掷
- python可视化——使用pygal模拟掷骰子
- 【NOIP2012模拟10.31】掷骰子