質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1433閲覧

javaの確率を用いた条件分岐と反復処理

kannnn

総合スコア3

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2023/05/12 16:40

前提

java初心者です。プログラミング学習のために、試しにパチンコのあたりに関するプログラムを作成し、投資出玉と実際に出た出玉、回転数などを表示するようにしたいです。

該当のソースコード

Java

1import java.util.Random; 2public class TMfin { 3 public static void main(String[] args){ 4 System.out.println("1~10までの中で数字を選んでください。"); 5 int num=new java.util.Scanner(System.in).nextInt(); 6 int sam=0; 7 Random rand =new Random(); 8 int back=450; 9 int count=1; 10 int threshold=60; 11 int threshold2=81; 12 while(true){ 13 int heso=(int)(Math.random()*10)+1; 14 if(heso==num){ 15 System.out.println("1~319までの中で数字を選んでください。"); 16 int num2=new java.util.Scanner(System.in).nextInt(); 17 while(true){ 18 int unicorn=(int)(Math.random()*319)+1; 19 if(unicorn==num2){ 20 System.out.println("大当たり!"); 21 System.out.println(sam+"回目! 投資約"+(sam*10)+"球!"); 22 int value=rand.nextInt(101); 23 if(value>=threshold){ 24 System.out.println("単発、、"+back+"球獲得"); 25 sam=0; 26 break; 27 }else if(value<threshold){ 28 while(true){ 29 if(value<threshold2){ 30 count++; 31 back+=1500; 32 }else{ 33 System.out.println("継続"+count+"回!"+back+"球獲得!"); 34 sam=0; 35 break; 36 } 37 } 38 } 39 }else{ 40 sam+=1; 41 } 42 } 43 }else{ 44 sam+=1; 45 } 46 } 47 } 48}

これを実行すると初当たりの数と投資球数のみが表示されてしまいます。どこが間違っているのでしょうか。

追記

このプログラムでは10回に1回抽選されるとし、大当たり確率は319分の1として計算しています。
rash突入率60%、継続率は81%、初当たり450発、その後はオール1500発としています。3000フィーバーはないものとして仮定したユニコーンです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2023/05/12 18:23 編集

>これを実行すると初当たりの数と投資球数のみが表示されてしまいます。 パチンコをやらないのでどういうことなのか全く分からないのですが、どういう表示になるはずがどうなっているのか、質問に追加編集して、入力も含めてそちらでの表示状態をソースコートと同じようにマークダウンでご提示願えますか。
jimbe

2023/05/12 18:52 編集

28~37 行目の >while(true){ > if(value<threshold2){ > count++; > back+=1500; > }else{ > System.out.println("継続"+count+"回!"+back+"球獲得!"); > sam=0; > break; > } >} は、 value < threshold2 の場合ループが終わりません。
kannnn

2023/05/13 00:21

返信ありがとうございます。一様出力的には319分の1を何回で当てられるのか、その後60%であたりを引けるかどうかの抽選を行うようにしています。これに外れた場合、単発、、450球獲得 と表示されるように想定しました。 60%の抽選を当てた場合、次に81%の抽選を行います。81%の抽選を当てた場合、1回当たるごとに変数backに1500を足していくようにしました。例えば2回81%を当てれば、back=3450 といった感じです。81%の抽選を外れると、継続2回! 3450球獲得! といった表示がされることを予定しておりました。
kannnn

2023/05/13 00:39

もう一度確認しましたがなぜこの場合だとループが終わらないのでしょうか? どこを修正したら動きますか?
jimbe

2023/05/13 02:49

>60%の抽選を当てた場合、次に81%の抽選を行います。 コードでは 60% の抽選が threshold と比較している 22 ~ 23 行目がそれと思いますが、 81 % の抽選というのは threshold2 との比較は 29 行目にあっても乱数の生成が無く 60 % の時の抽選の乱数値をそのまま使っています。 その為、 28 行目の while ループ中は value 変数は値が変わりませんので、 value < threshold2 は一度成立すると二度と不成立にはなりません。
guest

回答1

0

ベストアンサー

とりあえず抽選の所は do-while も使って定数ぽいのも埋め込んでみました。

java

1import java.util.Random; 2import java.util.Scanner; 3 4public class TMfin { 5 public static void main(String[] args){ 6 //@SuppressWarnings("resource") //"scanner が閉じられていない"という warning が鬱陶しい場合 7 Scanner scanner = new Scanner(System.in); 8 Random rand = new Random(); //これで乱数は生成出来るのでわざわざ Math.random を使う必要は無い 9 10 System.out.println("1~10 までの中で数字を選んでください。"); 11 int num = scanner.nextInt(); 12 13 for(int i=0; i<2; i++) { //最終的に無限としてもまずは2回にしておく 14 int sam = 0; 15 do sam ++; while(rand.nextInt(10)+1 != num); //入力した番号が出るまで sam をカウントしながら待つ (1/10) 16 17 System.out.println("1~319 までの中で数字を選んでください。"); 18 int num2 = scanner.nextInt(); //元が同じ(この場合は System.in) Scanner は複数作らず1つを使い回すこと 19 do sam++; while(rand.nextInt(319)+1 != num2); //入力した番号が出るまで sam をカウントしながら待つ (1/319) 20 21 System.out.println("大当たり!"); 22 System.out.println(sam + "回目! 投資約" + (sam*10) + "球!"); 23 if(rand.nextInt(100) < 60) { //rush突入 (60%) 24 int count = 0; //継続回数 25 while(rand.nextInt(100) < 81) count++; //継続 (81%) 26 System.out.println("継続" + count + "回!" + (450 + 1500 * count) + "球獲得!"); 27 } else { 28 System.out.println("単発、、" + 450 + "球獲得"); 29 } 30 } 31 } 32}
1~10 までの中で数字を選んでください。 5 1~319 までの中で数字を選んでください。 123 大当たり! 112回目! 投資約1120球! 継続0回!450球獲得! 1~319 までの中で数字を選んでください。 222 大当たり! 29回目! 投資約290球! 継続3回!4950球獲得!

投稿2023/05/13 18:19

編集2023/05/13 18:20
jimbe

総合スコア12646

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kannnn

2023/05/13 23:52

なるほど! なぜループが終わらないかが理解できました!ありがとうございます! わざわざコードまで頂いて本当に助かりますm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問