原神官方给的概率:
5星基础:0.6%,5星保底:1.6%,90抽5星保底;
4星基础:5.1%,4星保底:13%,10抽4星保底。
一开始我也想着直接用官方给的概率设置直接写入,但发现第90发才出金的概率占比实在太大,但凡玩过原神的都知道一般都是七八十发出金,到90发才出金的人我属实没见过,所以我在概率上进行了调整,75发后如果还没出金将逐步提升出金概率(我设置的为3%)。
设计的概率:
5星角色基础概率:0.6%,有50%为本期up角色,50%为常驻角色,当出常驻角色后下一次五星必为本期up角色,75抽未出后逐步提升五星概率(3%),90抽5星保底 ;
4星基础概率:5.1%,有50%为本期up四星角色,50%为其他四星,当出其他四星后下一次四星星必为本期up角色,10抽4星保底。
运行起来如下:
出金的时候:
四星没设计查询,五星可以查询:
全部代码:
import java.util.Random;
import java.util.Scanner;
public class Chouka_puls {
private static String[] sanxingwuqi = new String[] { "弹弓", "神射手之誓", "鸦羽弓", "翡玉法球", "讨龙英杰谭", "魔导绪论", "黑缨枪", "以理服人",
"沐浴龙血的剑", "铁影阔剑", "飞天御剑", "黎明神剑", "冷刃" }; // 三星武器
private static String[] sixingwuqi = new String[] { "弓藏", "祭礼弓", "绝弦", "西风猎弓", "昭心", "祭礼残章", "流浪乐章", "西风秘典", "西风长枪",
"匣里灭辰", "雨裁", "祭礼大剑", "钟剑", "西风大剑", "匣里龙吟", "祭礼剑", "笛剑", "西风剑" }; // 四星武器
private static String[] sixingjuese = new String[] { "辛焱", "砂糖", "重云", "诺艾尔", "班尼特", "凝光", "行秋", "北斗", "云堇",
"香菱", "安柏", "雷泽", "凯亚", "芭芭拉", "丽莎", "罗莎莉亚", "早柚", "九条裟罗" };// 四星角色(去除up四星角色)
private static String[] wuxingjuese = new String[] { "霆霓快雨:刻晴", "星天水镜:莫娜", "冻冻回魂夜:七七",
"晨曦的暗面:迪卢克", "蒲公英骑士:琴" }; // 五星角色
private static String[] upsixingjuese = new String[] { "菲谢尔", "托马", "迪奥娜" };// up四星角色
private static String upwuxingjuese = "浮世笑百姿:八重神子"; // up五星角色
static int dabaodi = 90; // 设置五星保底数量,默认为90
static int xiaobaodi = 10; // 设置四星保底数量,默认为10
static int WX[] = new int[1000];// 用来保存抽到的五星
static int WXNUM = 0;// 用来为保存五星数组计数,默认为零
static int sum = 0;// 设置抽卡的次数,默认为零
static int snum = 0;// 设置计算平均数量的基数,默认为零
static int sixingnum = 0, wuxingnum = 0;// 设置没有抽到四星与五星的次数,默认为零
static int SXNUM = 0;// 设置抽到的四星数量,默认为零
static int sxbd = 0, wxbd = 0;// 设置抽到非up角色的参数,默认为零
public static void main(String[] args) {
System.out.println("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*");
System.out.println("\t\t欢迎使用原神抽卡模拟器2.0" + "\n" + "模拟器概率公示:");
System.out.println("5星角色基础概率:0.6%,有50%为本期up角色,50%为常驻角色");
System.out.println("当出常驻角色后下一次五星必为本期up角色");
System.out.println("4星基础概率:5.1%,有50%为本期up四星角色,50%为其他四星");
System.out.println("当出其他四星后下一次四星星必为本期up角色");
System.out.println("五星保底:90抽,四星保底:10抽,75抽未出后逐步提升五星概率");
System.out.println("\t\t\t2022.3.1 痛忆思非");
System.out.println("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*");
chou();
}
static void chou() {
int x;
do {
menu();
Scanner in = new Scanner(System.in);
x = in.nextInt();
if (x == -1) {
Chaxun();// -1查询
} else if (x == -2) {
Reset();// -2重置数据
} else if (x > 0) // 抽卡概率主体部分
{
for (int i = 0; i < x; i++) {
if (wuxingnum >= 90)// 五星保底
{
if (wxbd > 0) {
upjuese();
wxbd = 0;
} else if (Probability((float) 50)) {
upjuese();
wxbd = 0;
} else {
wuxingrw();
wxbd++;
}
sixingnum++;
wuxingnum = 0;
snum = sum;
} else if (sixingnum >= 9)// 四星保底
{
if (sxbd > 0) {
upsixingrw();
sxbd = 0;
} else if (Probability((float) 50)) {
upsixingrw();
sxbd = 0;
} else {
if (Probability((float) 50)) {
sixingrw();
} else {
sixingwq();
}
sxbd++;
}
wuxingnum++;
SXNUM++;
sixingnum = 0;
} else if (wuxingnum >= 75 && wuxingchouka()) //大于75发时抽到五星
{
if (wxbd > 0) {
upjuese();
wxbd = 0;
} else if (Probability((float) 50)) {
upjuese();
wxbd = 0;
} else {
wuxingrw();
wxbd++;
}
sixingnum++;
wuxingnum = 0;
snum = sum;
} else if (Probability((float) 0.6) && wuxingnum < 75)// 小于75抽时抽到五星
{
if (wxbd > 0) {
upjuese();
wxbd = 0;
} else if (Probability((float) 50)) {
upjuese();
wxbd = 0;
} else {
wuxingrw();
wxbd++;
}
sixingnum++;
wuxingnum = 0;
snum = sum;
} else if (Probability((float) 5.1))// 抽到四星
{
if (sxbd > 0) {
upsixingrw();
sxbd = 0;
} else if (Probability((float) 50)) {
upsixingrw();
sxbd = 0;
} else {
if (Probability((float) 50)) {
sixingrw();
} else {
sixingwq();
}
sxbd++;
}
wuxingnum++;
SXNUM++;
sixingnum = 0;
} else // 抽到三星
{
sanxingwq();
sixingnum++;
wuxingnum++;
}
sum++;
}
} else {
System.out.println("输入错误请重新输入!");
}
} while (x != 0);
}
static boolean Probability(Float x)// 一个概率函数
{
x = x * 1000;
Random rand = new Random();
int y = rand.nextInt(100000);
if (y < x)
return true;
else
return false;
}
static void menu() // 菜单
{
System.out.println("***********************************************");
if (sum > 0) {
System.out.println("抽卡总数:" + sum + "\t" + "四星数量:" + SXNUM + "\t" + "五星数量:" + WXNUM);
if (snum > 0) {
System.out.println("平均" + snum / WXNUM + "抽一个金");
}
}
System.out.println("请输入你抽卡的次数:(0退出,-1查询,-2重置数据)");
System.out.println("***********************************************");
}
static void Chaxun()// 查询抽到的五星
{
int n = 0;// 换行标志
if (WXNUM == 0) {
System.out.println("未查询到数据!");
} else {
for (int i = 0; i < WXNUM; i++) {
if (WX[i] == 101) {
System.out.print(upwuxingjuese + "\t\t");
n++;
} else {
System.out.print(wuxingjuese[WX[i]] + "\t\t");
n++;
}
if (n >= 2) {
System.out.println();
n = 0;
}
}
System.out.println();
}
}
static void Reset()// 重置数据
{
WXNUM = 0;
SXNUM = 0;
sum = 0;
sixingnum = 0;
wuxingnum = 0;
sxbd = 0;
wxbd = 0;
}
static boolean wuxingchouka() // 超过75抽抽取五星概率
{
int m = 3;// 超过75抽每次增加的概率
float x = (float) ((wuxingnum - 75) * m + 0.6);
if (Probability(x)) {
return true;
} else
return false;
}
static void sanxingwq()// 三星武器
{
Random rand = new Random();
int y = rand.nextInt(sanxingwuqi.length);
System.out.println("三星武器 *** " + sanxingwuqi[y]);
}
static void sixingwq() // 四星武器
{
Random rand = new Random();
int y = rand.nextInt(sixingwuqi.length);
System.out.println("四星武器 **** " + sixingwuqi[y]);
}
static void upsixingrw()// up四星人物
{
Random rand = new Random();
int y = rand.nextInt(upsixingjuese.length);
System.out.println("四星角色 **** " + upsixingjuese[y]);
}
static void sixingrw()// 歪到的四星人物
{
Random rand = new Random();
int y = rand.nextInt(sixingjuese.length);
System.out.println("四星角色 **** " + sixingjuese[y]);
}
static void wuxingrw()// 歪到的五星人物
{
Random rand = new Random();
int y = rand.nextInt(wuxingjuese.length);
System.out.println("\n" + "五星角色 ***** " + wuxingjuese[y] + "\n");
WX[WXNUM] = y;
WXNUM++;
}
static void upjuese()// 五星up角色
{
System.out.println("\n" + "五星角色 ***** " + upwuxingjuese + "\n");
WX[WXNUM] = 101;
WXNUM++;
}
}