「1等、2等、3等と書いているボールがそれぞ3個あります。これらから無作為に2個とりだし、2個とも1等である確率を求める。」
という問題を乱数をもちいてプログラムしなさいといわれました。乱数の発生はできるのですが、確率の部分ができません。どなたか教えてもらえないでしょうか?
乱数をもちいた確率問題
Re: 乱数をもちいた確率問題
確率を求める方法が分からないのか、
プログラムにする方法がわからないのかどちらでしょうか?
プログラムにする方法がわからないのかどちらでしょうか?
Re: 乱数をもちいた確率問題
じゃあまず乱数を発生させるだけで良いのでそのプログラムを書いてください。
そして、この問題を解くときにどのような範囲の乱数を発生させればよいか考えてみてください。
そして、この問題を解くときにどのような範囲の乱数を発生させればよいか考えてみてください。
Re: 乱数をもちいた確率問題
>>「1等、2等、3等と書いているボールがそれぞ3個あります。これらから無作為に2個とりだし、2個とも1等である確率を求める。」
1等、1等、1等、2等、2等、2等、3等、3等、3等
最初の状態は、上記のような状態で9個のボールがあるわけですね。
まず、ここから無作為に1個取り出した時に1等が出る確率は3/9、つまり1/3です。
1等、1等、2等、2等、2等、3等、3等、3等
残りはこの8個のボールです。
ここから同じように無作為に1個取り出した時に1等が出る確率は2/8、つまり1/4です。
ですから、2個とも1等が出る確率は、1/3 × 1/4 = 1/12となります。
これをプログラムで表現するにあたって、分からないのはどこになりますか?
1等、1等、1等、2等、2等、2等、3等、3等、3等
最初の状態は、上記のような状態で9個のボールがあるわけですね。
まず、ここから無作為に1個取り出した時に1等が出る確率は3/9、つまり1/3です。
1等、1等、2等、2等、2等、3等、3等、3等
残りはこの8個のボールです。
ここから同じように無作為に1個取り出した時に1等が出る確率は2/8、つまり1/4です。
ですから、2個とも1等が出る確率は、1/3 × 1/4 = 1/12となります。
これをプログラムで表現するにあたって、分からないのはどこになりますか?
Re: 乱数をもちいた確率問題
>乱数をもちいてプログラムしなさい
という所でしょうね。
確率1/3で1等を出すルーチンと確率1/4で1等を出すルーチンを作って
両方から1等が出る回数をカウントして総回数で割れば答えが出ると思います。
直接、確率1/12の乱数プログラムを作っても仕様は満たすか?
という所でしょうね。
確率1/3で1等を出すルーチンと確率1/4で1等を出すルーチンを作って
両方から1等が出る回数をカウントして総回数で割れば答えが出ると思います。
直接、確率1/12の乱数プログラムを作っても仕様は満たすか?
- bitter_fox
- 記事: 607
- 登録日時: 13年前
- 住所: 大阪府
Re: 乱数をもちいた確率問題
言語がよく分からなかったのでJava(8)でsiosio さんが書きました: という問題を乱数をもちいてプログラムしなさいといわれました。乱数の発生はできるのですが、確率の部分ができません。どなたか教えてもらえないでしょうか?
をやってみました。参考にしてください。siosio さんが書きました: 「1等、2等、3等と書いているボールがそれぞ3個あります。これらから無作為に2個とりだし、2個とも1等である確率を求める。」
import java.util.*;
/**
* いわゆるランダムな試行
*/
public abstract class RandamableTrial<T> implements Trial<T>
{
private Random random = this.createRandom();
protected Random createRandom()
{
return new Random();
}
protected Random getRandom()
{
return random;
}
}
import java.util.*;
/**
* いわゆる取り出してみるというやつ
*/
public class PickOutTrial<T> extends RandamableTrial<List<T>>
{
private boolean reverse;
private int pickOutCount;
private Judger<List<T>> judger;
public PickOutTrial(int pickOutCount, boolean reverse, Judger<List<T>> judger)
{
this.pickOutCount = pickOutCount;
this.reverse = reverse;
this.judger = judger;
}
public boolean trial(List<T> source)
{
Objects.requireNonNull(source);
List<T> list = new ArrayList<>(source);
if ((!reverse && pickOutCount > list.size()) || list.isEmpty())
{
throw new IllegalArgumentException();
}
List<T> pickedOutList = new ArrayList<T>();
for (int i = 0; i < pickOutCount; i++)
{
int index = this.getRandom().nextInt(list.size());
pickedOutList.add(list.get(index));
if (!reverse)
{
list.remove(index);
}
}
return judger.judge(pickedOutList);
}
}
import java.util.*;
/**
* いわゆる確率
*/
public class Probability<T>
{
private List<T> source;
private int samplingCount;
private Trial<List<T>> trial;
public Probability(List<T> source, int samplingCount, Trial<List<T>> trial)
{
this.source = Collections.unmodifiableList(source);
this.samplingCount = samplingCount;
this.trial = trial;
}
public double probability()
{
int succeed = 0;
for (int i = 0; i < samplingCount; i++)
{
if (trial.trial(source))
{
succeed++;
}
}
return succeed / (double)samplingCount;
}
}
import java.util.*;
public class Main
{
private static final int SAMPLING_COUNT = 10000;
private static final int TEST_COUNT = 10;
public static void main(String[] args)
{
List<Ball> list = new ArrayList<Ball>()
{
{
Ball[] balls = Ball.values();
for (int i = 0; i < 3; i++)
{
this.addAll(Arrays.asList(balls));
}
}
};
Trial<List<Ball>> trial = new PickOutTrial<Ball>(2, false, l -> l.allMatch(Ball.FIRST#equals));
Probability<Ball> p = new Probability<>(list, SAMPLING_COUNT, trial);
double sum = 0;
for (int i = 0; i < TEST_COUNT; i++)
{
double probability = p.probability();
System.out.println(probability);
sum += probability;
}
System.out.println();
System.out.println(sum / TEST_COUNT);
}
}
[変更]取り出すやつの名前を変更。
[変更]Trial#trialがRandomを取らないように。RandomableTrialを導入。