ページ 11

よろしくお願いします。

Posted: 2011年1月14日(金) 15:28
by ささ
今卒論をやっています。
乱数を使うのですが制約条件のつけ方がわかりません。
2~44までの間の数字を選択するようにやろうと思っています。

ぜひよろしくお願いします。

Re: よろしくお願いします。

Posted: 2011年1月14日(金) 15:33
by softya(ソフト屋)
OS・開発環境・使用ライブラリが不明なので、一般論で答えます。

0~42の乱数を発生させて+2をすれば良いです。

もし0~RAND_MAXな乱数が発生する場合は、
・43で割った余りを取る(精度的にはおすすめできません)。
・(dobule)乱数/RAND_MAX * 42
と言った方法があります。

Re: よろしくお願いします。

Posted: 2011年1月14日(金) 15:36
by ささ
ありがとうございます!!

Re: よろしくお願いします。

Posted: 2011年1月14日(金) 17:04
by maru
softya(ソフト屋) さんが書きました:・43で割った余りを取る(精度的にはおすすめできません)。
・(dobule)乱数/RAND_MAX * 42
と言った方法があります。
43の剰余では多分0,1だけほんの少し(1/762)頻度が高くなりますが、無視できるかどうかは使用者側で判断すればよいことです。
・(dobule)乱数/RAND_MAX * 42だと、42が現れる確率は1/RAND_MAXですね。 * 43の間違いではないですか?
追記
一応検証したプログラムです。RAND_MAX個の乱数で42は0個でした。

コード:

#include <stdlib.h>
#include <assert.h>
#include <iostream>
int main()
{
	int	n[43] = {0};
	srand(0);
	for (int i = 0; i < RAND_MAX; ++i)
	{
		int	index = (double)rand()/RAND_MAX * 42;
		assert(index < 43);
		++n[index];
	}
	for (int i = 0; i < sizeof(n)/sizeof(n[0]); ++i)
	{
		std::cout << "n[" << i << "] = " << n[i] << "\t";
		if (i % 4 == 3)
		{
			std::cout << std::endl;
		}
	}

	return 0;
}
ただし、43にした場合は乱数がRAND_MAXでは無いことを確認する必要があるでしょう。

精度のよい乱数がほしければ「メルセンヌ・ツイスター」で検索することをお勧めします。

Re: よろしくお願いします。

Posted: 2011年1月15日(土) 16:54
by みけCAT
「苦しんで覚えるC言語」にやり方が載っています。
http://9cguide.appspot.com/21-02.html