よろしくお願いします。

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

よろしくお願いします。

#1

投稿記事 by ささ » 14年前

今卒論をやっています。
乱数を使うのですが制約条件のつけ方がわかりません。
2~44までの間の数字を選択するようにやろうと思っています。

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 14年前

OS・開発環境・使用ライブラリが不明なので、一般論で答えます。

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

もし0~RAND_MAXな乱数が発生する場合は、
・43で割った余りを取る(精度的にはおすすめできません)。
・(dobule)乱数/RAND_MAX * 42
と言った方法があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ささ

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

#3

投稿記事 by ささ » 14年前

ありがとうございます!!

maru
記事: 150
登録日時: 14年前

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

#4

投稿記事 by maru » 14年前

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では無いことを確認する必要があるでしょう。

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

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#5

投稿記事 by みけCAT » 14年前

「苦しんで覚えるC言語」にやり方が載っています。
http://9cguide.appspot.com/21-02.html
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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