试给出下面赌博中的蒙特卡洛模拟
在一次旅游途中,小王看到有人用20枚签(其中10枚标有5分分值,10枚标有10分分值)设赌。让游客从中抽出10枚,以10枚签的分值总和为奖罚金额,见表1
表1
分值 50,100 55,95 60,65,85,90 70,75,80
奖罚金额 奖100元 奖10元 不奖不罚 罚1元
你看,有奖有罚,在11个分值中有4个分值可以获奖,且最高奖额为100元;只有3个分值要受罚,而罚额仅为1元,很有吸引力吧?怪不得有些游客摩拳擦掌,跃跃欲试。那么这些奖是不是这么好拿呢?
试分析此游戏中,谁是真正的赢家?
在一次旅游途中,小王看到有人用20枚签(其中10枚标有5分分值,10枚标有10分分值)设赌。让游客从中抽出10枚,以10枚签的分值总和为奖罚金额,见表1
表1
分值 50,100 55,95 60,65,85,90 70,75,80
奖罚金额 奖100元 奖10元 不奖不罚 罚1元
你看,有奖有罚,在11个分值中有4个分值可以获奖,且最高奖额为100元;只有3个分值要受罚,而罚额仅为1元,很有吸引力吧?怪不得有些游客摩拳擦掌,跃跃欲试。那么这些奖是不是这么好拿呢?
试分析此游戏中,谁是真正的赢家?
50 和 100 奖100元
55 和 95 奖10元
60 65 90 85 不奖不罚
70 75 80 罚1元以下是代码 每局大约输8角
import java.util.LinkedList;
import java.util.Random;public class Test {
public static int play() {
Drawer drawer = new Drawer();
int result = drawer.draw();
switch (result) {
case 50:
case 100:
return 100;
case 55:
case 95: {
return 10;
}
case 60:
case 65:
case 85:
case 90:
return 0;
case 70:
case 75:
case 80:
return -1;
default:
System.out.println("Error Happened!");
return 0;
}
} public static void main(String[] args) {
final int count = 10000;
int sum = 0;
for (int i = 0; i < count; i++) {
sum += play();
}
System.out.println("Total Win : " + sum);
System.out.println("Win Per Game : " + (double)sum / (double)count);
}
}class Drawer {
LinkedList<Integer> lots = null; public Drawer() {
lots = new LinkedList<Integer>();
for (int i = 0; i < 10; i++) {
lots.add(5);
lots.add(10);
}
} public int draw() {
Random rand = new Random();
int sum = 0;
for (int i = 0; i < 10; i++) {
int index = rand.nextInt(lots.size());
int lot = lots.remove(index);
System.out.print(lot + " ");
sum += lot;
}
System.out.println(" : " + sum);
return sum;
}
}
public class Lottery
{
public static double getTotalNum()
{
return Math.pow(2, 10);
}
public static int[] getNums()
{
int[] returnNum = new int[11];
int[] i = new int[10];
for (i[0] = 5; i[0] <= 10; i[0] += 5)
{
for (i[1] = 5; i[1] <= 10; i[1] += 5)
{
for (i[2] = 5; i[2] <= 10; i[2] += 5)
{
for (i[3] = 5; i[3] <= 10; i[3] += 5)
{
for (i[4] = 5; i[4] <= 10; i[4] += 5)
{
for (i[5] = 5; i[5] <= 10; i[5] += 5)
{
for (i[6] = 5; i[6] <= 10; i[6] += 5)
{
for (i[7] = 5; i[7] <= 10; i[7] += 5)
{
for (i[8] = 5; i[8] <= 10; i[8] += 5)
{
for (i[9] = 5; i[9] <= 10; i[9] += 5)
{
int total = 0;
for (int j = 0; j < 10; j++)
{
total += i[j];
}
switch (total)
{
case 50: returnNum[0]++; break;
case 55: returnNum[1]++; break;
case 60: returnNum[2]++; break;
case 65: returnNum[3]++; break;
case 70: returnNum[4]++; break;
case 75: returnNum[5]++; break;
case 80: returnNum[6]++; break;
case 85: returnNum[7]++; break;
case 90: returnNum[8]++; break;
case 95: returnNum[9]++; break;
case 100: returnNum[10]++; break;
}
}
}
}
}
}
}
}
}
}
}
return returnNum;
}
public static void main(String[] args)
{
double totalNum = getTotalNum();
int[] tmp = getNums();
int num50 = tmp[0];
int num55 = tmp[1];
int num60 = tmp[2];
int num65 = tmp[3];
int num70 = tmp[4];
int num75 = tmp[5];
int num80 = tmp[6];
int num85 = tmp[7];
int num90 = tmp[8];
int num95 = tmp[9];
int num100 = tmp[10];
double money = (100 * (num50 + num100) + 10 * (num55 + num95) - 1 * (num70 + num75 + num80)) / totalNum;
System.out.println(money);
}
}
import java.util.*;class CombineTest {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(new Integer[]{5,5,5,5,5,5,5,5,5,5,10,10,10,10,10,10,10,10,10,10});
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
combine(list, 10, new ArrayList<Integer>(), map);
double total = 0;
for (Integer i : map.values()) {
total += i;
}
System.out.printf("total=%.3f\n", total);
List<Map.Entry<Integer, Integer>> result = new ArrayList<Map.Entry<Integer, Integer>>(map.entrySet());
Collections.sort(result, new Comparator<Map.Entry<Integer, Integer>>() {
public int compare(Map.Entry<Integer, Integer> e1, Map.Entry<Integer, Integer> e2) {
if (e1.getValue().compareTo(e2.getValue()) == 0) {
return e1.getKey() - e2.getKey();
}
return e1.getValue() - e2.getValue();
}
});
for (Map.Entry<Integer, Integer> e : result) {
System.out.printf("%d:%d, percent=%.7f\n", e.getKey(), e.getValue(), e.getValue()/total);
}
} public static void combine(List<Integer> list, int n, List<Integer> buf, Map<Integer, Integer> map) {
if (list.size() < n) {
return;
} if (list.size() == n) {
buf.addAll(list);
int sum = 0;
for (Integer i : buf) {
sum += i;
}
Integer v = map.get(sum);
if (v == null) {
v = 0;
}
map.put(sum, v+1);
return;
} if (n == 1) {
int sum = 0;
for (Integer i : buf) {
sum += i;
}
for (Integer i : list) {
sum += i;
Integer v = map.get(sum);
if (v == null) {
v = 0;
}
map.put(sum, v+1);
sum -= i;
}
return;
} for (int i=0; i<list.size(); i++) {
List<Integer> tmp = new ArrayList<Integer>(buf);
tmp.add(list.get(i));
combine(list.subList(i+1, list.size()), n-1, tmp, map);
} }
}
List<Integer> list = Arrays.asList(new Integer[]{5,5,5,5,5,5,5,5,5,5,10,10,10,10,10,10,10,10,10,10});
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
combine(list, 10, new ArrayList<Integer>(), map);
double total = 0;
for (Integer i : map.values()) {
total += i;
}
System.out.printf("total=%.3f\n", total);
List<Map.Entry<Integer, Integer>> result = new ArrayList<Map.Entry<Integer, Integer>>(map.entrySet());
Collections.sort(result, new Comparator<Map.Entry<Integer, Integer>>() {
public int compare(Map.Entry<Integer, Integer> e1, Map.Entry<Integer, Integer> e2) {
if (e1.getValue().compareTo(e2.getValue()) == 0) {
return e1.getKey() - e2.getKey();
}
return e1.getValue() - e2.getValue();
}
});
int count = 0;
double money = 1.0, win=money;
for (Map.Entry<Integer, Integer> e : result) {
System.out.printf("%d:%d, percent=%.7f\n", e.getKey(), e.getValue(), e.getValue()/total);
if (count < 2) {
win += 100 * e.getValue()/total;
} else if (count < 4) {
win += 10 * e.getValue()/total;
} else if (count >= result.size()-3) {
win -= e.getValue()/total;
}
count++;
}
System.out.printf("win=%.7f\n", (win-money)/money);
} public static void combine(List<Integer> list, int n, List<Integer> buf, Map<Integer, Integer> map) {
if (list.size() < n) {
return;
} if (list.size() == n) {
buf.addAll(list);
int sum = 0;
for (Integer i : buf) {
sum += i;
}
Integer v = map.get(sum);
if (v == null) {
v = 0;
}
map.put(sum, v+1);
return;
} if (n == 1) {
int sum = 0;
for (Integer i : buf) {
sum += i;
}
for (Integer i : list) {
sum += i;
Integer v = map.get(sum);
if (v == null) {
v = 0;
}
map.put(sum, v+1);
sum -= i;
}
return;
} for (int i=0; i<list.size(); i++) {
List<Integer> tmp = new ArrayList<Integer>(buf);
tmp.add(list.get(i));
combine(list.subList(i+1, list.size()), n-1, tmp, map);
} }
}打印结果
total=184756.000
50:1, percent=0.0000054
100:1, percent=0.0000054
55:100, percent=0.0005413
95:100, percent=0.0005413
60:2025, percent=0.0109604
90:2025, percent=0.0109604
65:14400, percent=0.0779406
85:14400, percent=0.0779406
70:44100, percent=0.2386932
80:44100, percent=0.2386932
75:63504, percent=0.3437182
win=-0.8091970
也就是说,赢钱的概率是-0.8091970,即输钱的概率是0.8091970
{
public static void main(String args[])
{
keji x=new keji(530,0.7f);
x.jiage=(int)x.getjiage(530,0.7f);
x.showleixing();
x.showjiage();
wenyi y=new wenyi(530,0.7f);
y.jiage=(int)y.getjiage(530,0.7f);
y.showleixing();
y.showjiage();
jiaocai z=new jiaocai(530,0.7f);
z.jiage=(int)z.getjiage(530,0.7f);
z.showleixing();
z.showjiage();
}
}
interface book
{
abstract void showleixing();
abstract double getjiage(int yema,float zhekou);
}
class keji implements book
{
int yema;
float zhekou;
double jiage;
public keji(int yema,float zhekou)
{
this.yema=yema;
this.zhekou=zhekou;
}
public void showleixing()
{
System.out.println("这本书是科技类书");
}
public double getjiage(int yema,float zhekou)
{
return yema*0.1*zhekou;
}
public void showjiage()
{
System.out.println("它的价格是:"+jiage);
}
}
class wenyi implements book
{
int yema;
float zhekou;
double jiage;
public wenyi(int yema,float zhekou)
{
this.yema=yema;
this.zhekou=zhekou;
}
public void showleixing()
{
System.out.println("这本书是文艺类书");
}
public double getjiage(int yema,float zhekou)
{
return yema*0.08*zhekou;
}
public void showjiage()
{
System.out.println("它的价格是:"+jiage);
}
}
class jiaocai implements book
{
int yema;
float zhekou;
double jiage;
public jiaocai(int yema,float zhekou)
{
this.yema=yema;
this.zhekou=zhekou;
}
public void showleixing()
{
System.out.println("这本书是教材类书");
}
public double getjiage(int yema,float zhekou)
{
return yema*0.05*zhekou;
}
public void showjiage()
{
System.out.println("它的价格是:"+jiage);
}
}