今卒論をやっています。
乱数を使うのですが制約条件のつけ方がわかりません。
2~44までの間の数字を選択するようにやろうと思っています。
ぜひよろしくお願いします。
よろしくお願いします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: よろしくお願いします。
OS・開発環境・使用ライブラリが不明なので、一般論で答えます。
0~42の乱数を発生させて+2をすれば良いです。
もし0~RAND_MAXな乱数が発生する場合は、
・43で割った余りを取る(精度的にはおすすめできません)。
・(dobule)乱数/RAND_MAX * 42
と言った方法があります。
0~42の乱数を発生させて+2をすれば良いです。
もし0~RAND_MAXな乱数が発生する場合は、
・43で割った余りを取る(精度的にはおすすめできません)。
・(dobule)乱数/RAND_MAX * 42
と言った方法があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: よろしくお願いします。
43の剰余では多分0,1だけほんの少し(1/762)頻度が高くなりますが、無視できるかどうかは使用者側で判断すればよいことです。softya(ソフト屋) さんが書きました:・43で割った余りを取る(精度的にはおすすめできません)。
・(dobule)乱数/RAND_MAX * 42
と言った方法があります。
・(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;
}
精度のよい乱数がほしければ「メルセンヌ・ツイスター」で検索することをお勧めします。
Re: よろしくお願いします。
「苦しんで覚えるC言語」にやり方が載っています。
http://9cguide.appspot.com/21-02.html
http://9cguide.appspot.com/21-02.html
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)