之前模拟过七星酒馆任务、感恩节火鸡任务还有个啥我忘了。。。。嗯差不多一个意思,省去繁琐的计算,用计算机暴力模拟得出白嫖什么东西的概率,就酱。这次模拟一千万个玩家,按白嫖的78个骰子计算。
规则:有幸运骰子后能用幸运骰子白嫖步数的都白嫖。资源工坊不统计,只统计星星。最后一步剩下一个幸运骰子按+5星星算。
塔罗牌事件我只遇到过9个,或许有遗漏?
这次还是用Java写的,本来想用Python练练不过发现自己Python还是不够熟练,先用Java写出来再慢慢琢磨复刻吧。
根据前几波的经验下面大量发文字会被度娘抽楼,所以。。。大概还得申诉一次吧
复制过来的没有缩进,会有点难看,还好不是Python,Python要是没缩进代码就废了,这个没缩进复制一下还是能跑的。。
代码在这:
import java.util.Date
public class 放置大富翁{
//塔罗牌统计:①下次资源翻倍②双倍骰子③随机工坊++④下个骰子倒退
//⑤回到起点⑥吞掉下次站立位置的资源(路过星星还是会给)⑦下个位置的星星翻倍一次
//⑧两个骰子⑨随机工坊--⑩推测可能有吞掉星星的事件但我没遇到
//本脚本①⑥不会起作用。
//工坊总数量为13资源+3星星16个,特殊事件4个。
//21格子。0为起点。1236789 12 13 14 16 17 19为资源。4、11、18为星星屋
//5送骰子,10塔罗牌,15正邪,20送幸运骰子
public static void main(String[] args) {
long d1=new Date().getTime();
double s140=0;//皮肤
double s170=0;//魔球
double s200=0;//五星
double s230=0;//资源
double s260=0;//光暗
double s300=0;//九星
double heidong=0;//连皮肤都拿不到的黑洞
double unlucky=0;//自始至终没拿到幸运骰子
double ps=10000000;//玩家数量
for(int i=0;i<ps;i++) {
Player p=new Player();
while(p.dice!=-1) {
p.roll();
}
if(p.unlucky) {
unlucky++;
}
if(p.star>299) {
s300++;
}else if(p.star>259) {
s260++;
}else if(p.star>229) {
s230++;
}else if(p.star>199) {
s200++;
}else if(p.star>169) {
s170++;
}else if(p.star>139) {
s140++;
}else {
heidong++;
}
}
System.out.println("总共"+ps+"个玩家玩这个大富翁");
System.out.println(s300+"个玩家嫖到了九星,占玩家总数的"+String.format("%.3f", (s300/ps*100))+"%");
System.out.println(s260+"个玩家嫖到了光暗,占玩家总数的"+String.format("%.3f", (s260/ps*100))+"%");
System.out.println(s230+"个玩家嫖到了资源箱子,占玩家总数的"+String.format("%.3f",(s260/ps*100))+"%");
System.out.println(s200+"个玩家嫖到了四系五星,占玩家总数的"+String.format("%.3f",(s230/ps*100))+"%");
System.out.println(s170+"个玩家嫖到了魔球,占玩家总数的"+String.format("%.3f",(s200/ps*100))+"%");
System.out.println(s140+"个非酋只嫖到皮肤,占玩家总数的"+String.format("%.3f",(s170/ps*100))+"%");
System.out.println("有"+heidong+"个黑洞连皮肤都拿不到,占玩家总数的"+String.format("%.3f",(s140/ps*100))+"%");
System.out.println("有"+unlucky+"个玩家自始至终没有幸运骰子,占玩家总数的"+String.format("%.3f",(unlucky/ps*100))+"%");
long d2=new Date().getTime();
long time=d2-d1;
System.out.println("以上计算耗时"+time+"毫秒");
}
}
class Player{
int dice=78;
int step=0;
int star=0;
boolean unlucky=true;
boolean lucky=false; //是否有幸运骰子
boolean zhengxie=false; //是否在正邪小屋
//下面4个是塔罗牌事件
boolean shuangbei=false; //是否双倍点数
boolean liangge=false; //是否两个骰子
boolean stardouble=false; //是否双倍星星
boolean back=false; //是否强行后退
int star4=3;
int star11=3;
int star18=3;
public Player() {
super();
}
public void roll(){
if(dice==0) {
star+=5;//最后把幸运骰子用掉,就不写太复杂了加五个星星吧
dice--;
return;
}
if(step>13&&step!=15&&lucky&&step!=20) {
move(20-step); //如果有幸运骰子并且在14格以后并且不在正邪小屋直接嫖步数
return;
}
dice--;
int a=(int) (Math.random()*6+1);
int b;
if(shuangbei) {
b=a*2;
move(b);
shuangbei=false;
return;
}
if(liangge) {
int c=(int) (Math.random()*6+1);
b=a+c;
move(b);
liangge=false;
return;
}
if(zhengxie) {
if(a%2==0) {//如果a是偶数
b=a;
}else { //a是奇数
b=-a;
}
move(b);
zhengxie=false;
return;
}
if(back) {
b=-a;
move(b);
back=false;
return;
}
move(a);
}
public void move(int a) {
if(a<0) {
step+=a;
return;
}else {
for(int i=0;i<a;i++) {
step++;
if(step==21) {
step=1;
}
pass();
}
stay();
}
}
public void pass() {
if(stardouble&&step==11) {
star+=star11*2;
return;
}
switch (step) {
case 4:
star+=star4;
break;
case 11:
star+=star11;
break;
case 18:
star+=star18;
break;
default:
break;
}
}
public void stay() {//资源就忽略不计啦,只计算星星和特殊事件
//System.out.println("停在了第"+step+"步");
switch (step) {
case 4:
if(star4<5) {
star4++;
}
break;
case 5:
dice++;
break;
case 10:
tarot();
break;
case 11:
if(star11<5) {
star11++;
}
break;
case 18:
if(star18<5) {
star18++;
}
break;
case 20:
lucky=true;
unlucky=false;
break;
default:
break;
}
}
private void tarot() {
//塔罗牌9个事件,假设概率一样。2个事件是没用的。
int a=(int) (Math.random()*9+1);
switch (a) {
case 1:
shuangbei=true;//下次走双倍
break;
case 2:
liangge=true;//下次俩骰子
break;
case 3:
stardouble=true;//双倍星星
break;
case 4:
step=0;//回到起点
break;
case 5:
back=true;//下次倒着走
break;
case 6: //随机工坊++,16个工坊,有16分之三概率影响到星星屋
int b=(int) (Math.random()*16);//区间为【0,15】
switch (b) {
case 0:
star4++;
break;
case 1:
star11++;
break;
case 2:
star18++;
break;
default:
break;
}
break;
case 7://随机工坊--
int c=(int) (Math.random()*16);//区间为【0,15】
switch (c) {
case 0:
star4--;
break;
case 1:
star11--;
break;
case 2:
star18--;
break;
default:
break;
}
}
}
}
这里上结论:
总共1千万个玩家玩这个大富翁
587918.0个玩家嫖到了九星,占玩家总数的5.879%
1884433.0个玩家嫖到了光暗,占玩家总数的18.844%
2919339.0个玩家嫖到了资源箱子,占玩家总数的18.844%
3543587.0个玩家嫖到了四系五星,占玩家总数的29.193%
1017871.0个玩家嫖到了魔球,占玩家总数的35.436%
46671.0个非酋只嫖到皮肤,占玩家总数的10.179%
有181.0个黑洞连皮肤都拿不到,占玩家总数的0.467%
有93916.0个玩家自始至终没有幸运骰子,占玩家总数的0.939%
以上计算耗时67966毫秒
居然有接近6%的玩家白嫖了300星星,我其实不太信,估计卓杭设计的概率并不是均匀的,我这里是均匀计算,或许是塔罗牌事件有遗漏?
规则:有幸运骰子后能用幸运骰子白嫖步数的都白嫖。资源工坊不统计,只统计星星。最后一步剩下一个幸运骰子按+5星星算。
塔罗牌事件我只遇到过9个,或许有遗漏?
这次还是用Java写的,本来想用Python练练不过发现自己Python还是不够熟练,先用Java写出来再慢慢琢磨复刻吧。
根据前几波的经验下面大量发文字会被度娘抽楼,所以。。。大概还得申诉一次吧
复制过来的没有缩进,会有点难看,还好不是Python,Python要是没缩进代码就废了,这个没缩进复制一下还是能跑的。。
代码在这:
import java.util.Date
public class 放置大富翁{
//塔罗牌统计:①下次资源翻倍②双倍骰子③随机工坊++④下个骰子倒退
//⑤回到起点⑥吞掉下次站立位置的资源(路过星星还是会给)⑦下个位置的星星翻倍一次
//⑧两个骰子⑨随机工坊--⑩推测可能有吞掉星星的事件但我没遇到
//本脚本①⑥不会起作用。
//工坊总数量为13资源+3星星16个,特殊事件4个。
//21格子。0为起点。1236789 12 13 14 16 17 19为资源。4、11、18为星星屋
//5送骰子,10塔罗牌,15正邪,20送幸运骰子
public static void main(String[] args) {
long d1=new Date().getTime();
double s140=0;//皮肤
double s170=0;//魔球
double s200=0;//五星
double s230=0;//资源
double s260=0;//光暗
double s300=0;//九星
double heidong=0;//连皮肤都拿不到的黑洞
double unlucky=0;//自始至终没拿到幸运骰子
double ps=10000000;//玩家数量
for(int i=0;i<ps;i++) {
Player p=new Player();
while(p.dice!=-1) {
p.roll();
}
if(p.unlucky) {
unlucky++;
}
if(p.star>299) {
s300++;
}else if(p.star>259) {
s260++;
}else if(p.star>229) {
s230++;
}else if(p.star>199) {
s200++;
}else if(p.star>169) {
s170++;
}else if(p.star>139) {
s140++;
}else {
heidong++;
}
}
System.out.println("总共"+ps+"个玩家玩这个大富翁");
System.out.println(s300+"个玩家嫖到了九星,占玩家总数的"+String.format("%.3f", (s300/ps*100))+"%");
System.out.println(s260+"个玩家嫖到了光暗,占玩家总数的"+String.format("%.3f", (s260/ps*100))+"%");
System.out.println(s230+"个玩家嫖到了资源箱子,占玩家总数的"+String.format("%.3f",(s260/ps*100))+"%");
System.out.println(s200+"个玩家嫖到了四系五星,占玩家总数的"+String.format("%.3f",(s230/ps*100))+"%");
System.out.println(s170+"个玩家嫖到了魔球,占玩家总数的"+String.format("%.3f",(s200/ps*100))+"%");
System.out.println(s140+"个非酋只嫖到皮肤,占玩家总数的"+String.format("%.3f",(s170/ps*100))+"%");
System.out.println("有"+heidong+"个黑洞连皮肤都拿不到,占玩家总数的"+String.format("%.3f",(s140/ps*100))+"%");
System.out.println("有"+unlucky+"个玩家自始至终没有幸运骰子,占玩家总数的"+String.format("%.3f",(unlucky/ps*100))+"%");
long d2=new Date().getTime();
long time=d2-d1;
System.out.println("以上计算耗时"+time+"毫秒");
}
}
class Player{
int dice=78;
int step=0;
int star=0;
boolean unlucky=true;
boolean lucky=false; //是否有幸运骰子
boolean zhengxie=false; //是否在正邪小屋
//下面4个是塔罗牌事件
boolean shuangbei=false; //是否双倍点数
boolean liangge=false; //是否两个骰子
boolean stardouble=false; //是否双倍星星
boolean back=false; //是否强行后退
int star4=3;
int star11=3;
int star18=3;
public Player() {
super();
}
public void roll(){
if(dice==0) {
star+=5;//最后把幸运骰子用掉,就不写太复杂了加五个星星吧
dice--;
return;
}
if(step>13&&step!=15&&lucky&&step!=20) {
move(20-step); //如果有幸运骰子并且在14格以后并且不在正邪小屋直接嫖步数
return;
}
dice--;
int a=(int) (Math.random()*6+1);
int b;
if(shuangbei) {
b=a*2;
move(b);
shuangbei=false;
return;
}
if(liangge) {
int c=(int) (Math.random()*6+1);
b=a+c;
move(b);
liangge=false;
return;
}
if(zhengxie) {
if(a%2==0) {//如果a是偶数
b=a;
}else { //a是奇数
b=-a;
}
move(b);
zhengxie=false;
return;
}
if(back) {
b=-a;
move(b);
back=false;
return;
}
move(a);
}
public void move(int a) {
if(a<0) {
step+=a;
return;
}else {
for(int i=0;i<a;i++) {
step++;
if(step==21) {
step=1;
}
pass();
}
stay();
}
}
public void pass() {
if(stardouble&&step==11) {
star+=star11*2;
return;
}
switch (step) {
case 4:
star+=star4;
break;
case 11:
star+=star11;
break;
case 18:
star+=star18;
break;
default:
break;
}
}
public void stay() {//资源就忽略不计啦,只计算星星和特殊事件
//System.out.println("停在了第"+step+"步");
switch (step) {
case 4:
if(star4<5) {
star4++;
}
break;
case 5:
dice++;
break;
case 10:
tarot();
break;
case 11:
if(star11<5) {
star11++;
}
break;
case 18:
if(star18<5) {
star18++;
}
break;
case 20:
lucky=true;
unlucky=false;
break;
default:
break;
}
}
private void tarot() {
//塔罗牌9个事件,假设概率一样。2个事件是没用的。
int a=(int) (Math.random()*9+1);
switch (a) {
case 1:
shuangbei=true;//下次走双倍
break;
case 2:
liangge=true;//下次俩骰子
break;
case 3:
stardouble=true;//双倍星星
break;
case 4:
step=0;//回到起点
break;
case 5:
back=true;//下次倒着走
break;
case 6: //随机工坊++,16个工坊,有16分之三概率影响到星星屋
int b=(int) (Math.random()*16);//区间为【0,15】
switch (b) {
case 0:
star4++;
break;
case 1:
star11++;
break;
case 2:
star18++;
break;
default:
break;
}
break;
case 7://随机工坊--
int c=(int) (Math.random()*16);//区间为【0,15】
switch (c) {
case 0:
star4--;
break;
case 1:
star11--;
break;
case 2:
star18--;
break;
default:
break;
}
}
}
}
这里上结论:
总共1千万个玩家玩这个大富翁
587918.0个玩家嫖到了九星,占玩家总数的5.879%
1884433.0个玩家嫖到了光暗,占玩家总数的18.844%
2919339.0个玩家嫖到了资源箱子,占玩家总数的18.844%
3543587.0个玩家嫖到了四系五星,占玩家总数的29.193%
1017871.0个玩家嫖到了魔球,占玩家总数的35.436%
46671.0个非酋只嫖到皮肤,占玩家总数的10.179%
有181.0个黑洞连皮肤都拿不到,占玩家总数的0.467%
有93916.0个玩家自始至终没有幸运骰子,占玩家总数的0.939%
以上计算耗时67966毫秒
居然有接近6%的玩家白嫖了300星星,我其实不太信,估计卓杭设计的概率并不是均匀的,我这里是均匀计算,或许是塔罗牌事件有遗漏?