入力された確率通りに当たるくじを作りたいです。
その際に乱数を使おうと思ているのですが、確率が整数の時はよいのですが少数の時にどのようにすればよいのか悩んでいます。
思いついたのは整数になるまで10倍して当たりの本数も10倍する方法です。そこで入力された少数を整数になるまで10倍できる方法で効率の良い方法を教えてください。
またそれよりも良い方法があれば教えていただきたいです。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
p = 確率
として
double p = 0.25; // 入力した確率 if (p > Math.random()){ // あたり }else{ // ハズレ }
とするのが簡潔だと思います。
投稿2017/04/12 12:02
総合スコア868
0
BigDecimalは、内部で(整数)×10^xの形で表現しています。これを利用します。
0. 目的の値をBigDecimal.valueOfメソッドに渡し、BigDecimalオブジェクトを作成。
0. 1.で生成したオブジェクトに対し、stripTrailingZerosメソッドを実行し、新たなオブジェクト生成。
0. 2.のオブジェクトに対し、scaleメソッドを実行して得られる値が、掛けるべき10の累乗数。
unscaledValueを実行して得られるBigIntegerが、整数値。
java
1import java.math.BigDecimal; 2 3public class Q72264 { 4 5 public static void main(String[] args) { 6 double d = Math.random(); 7 BigDecimal bd = BigDecimal.valueOf(d).stripTrailingZeros(); 8 System.out.println("d = " + d); 9 System.out.println("bd = " + bd); 10 System.out.println(bd.scale()); 11 System.out.println(bd.unscaledValue()); 12 } 13 14}
###実行例
d = 0.41681736871288555
bd = 0.41681736871288555
17
41681736871288555
ただし、Math.random()で得られるようなdouble値は小数点以下の桁数が多く、くじの本数を10倍していくとlongですら手に余る桁数になる。
また、実行例で示された例では表示される数値はすでに丸められている値。どこまで正確性を要求するかで仕様が変わってくる。
投稿2017/04/12 18:13
総合スコア20651
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/04/13 10:27
0
小数 d にかけて整数になる数はこんな感じで求められます。
小数を文字列に直して小数点が後ろから何文字目にあるか数えて 10 の累乗を返しています。
Java
1static int getRatio(double d) 2{ 3 int r = new Double(d).toString().lastIndexOf("."); 4 if (r < 0) return 1; 5 return (int)Math.pow(10, r); 6}
追記
以上、確かめもせずに間違いを書きました。後ほど修正します。
追記
Java
1static int getRatio(double d) 2{ 3 double r = d % 1; 4 if (r == 0) return 1; 5 return (int)Math.pow(10, String.valueOf(r).length() - 2); 6}
これでできるはずです。
投稿2017/04/12 12:18
編集2017/04/12 12:46総合スコア28660
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/04/13 10:28
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/04/13 10:27