乱数をもちいた確率問題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
siosio

乱数をもちいた確率問題

#1

投稿記事 by siosio » 12年前

「1等、2等、3等と書いているボールがそれぞ3個あります。これらから無作為に2個とりだし、2個とも1等である確率を求める。」

という問題を乱数をもちいてプログラムしなさいといわれました。乱数の発生はできるのですが、確率の部分ができません。どなたか教えてもらえないでしょうか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 乱数をもちいた確率問題

#2

投稿記事 by h2so5 » 12年前

確率を求める方法が分からないのか、
プログラムにする方法がわからないのかどちらでしょうか?

siosio

Re: 乱数をもちいた確率問題

#3

投稿記事 by siosio » 12年前

どちらもです!

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 乱数をもちいた確率問題

#4

投稿記事 by h2so5 » 12年前

じゃあまず乱数を発生させるだけで良いのでそのプログラムを書いてください。
そして、この問題を解くときにどのような範囲の乱数を発生させればよいか考えてみてください。

アバター
バグ
記事: 130
登録日時: 13年前
住所: 愛媛県
連絡を取る:

Re: 乱数をもちいた確率問題

#5

投稿記事 by バグ » 12年前

>>「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となります。
これをプログラムで表現するにあたって、分からないのはどこになりますか?

アバター
さかまき
記事: 92
登録日時: 13年前

Re: 乱数をもちいた確率問題

#6

投稿記事 by さかまき » 12年前

>乱数をもちいてプログラムしなさい

という所でしょうね。
確率1/3で1等を出すルーチンと確率1/4で1等を出すルーチンを作って
両方から1等が出る回数をカウントして総回数で割れば答えが出ると思います。

直接、確率1/12の乱数プログラムを作っても仕様は満たすか?

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: 乱数をもちいた確率問題

#7

投稿記事 by bitter_fox » 12年前

siosio さんが書きました: という問題を乱数をもちいてプログラムしなさいといわれました。乱数の発生はできるのですが、確率の部分ができません。どなたか教えてもらえないでしょうか?
言語がよく分からなかったのでJava(8)で
siosio さんが書きました: 「1等、2等、3等と書いているボールがそれぞ3個あります。これらから無作為に2個とりだし、2個とも1等である確率を求める。」
をやってみました。参考にしてください。

コード:

/**
  * いわゆるボール
  */
public enum Ball
{
	FIRST, SECOND, THIRD;
}

コード:

/**
  * いわゆる判定するやつ
  */
public interface Judger<T>
{
	boolean judge(T t);
}

コード:

/**
  * いわゆるやってみるというやつ
  */
public interface Trial<T>
{
	boolean trial(T t);
}

コード:

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);
	}
}
[hr]
[変更]取り出すやつの名前を変更。
[変更]Trial#trialがRandomを取らないように。RandomableTrialを導入。

閉鎖

“C言語何でも質問掲示板” へ戻る