ページ 1 / 1
乱数
Posted: 2006年12月20日(水) 12:23
by empty
はじめまして。よろしくお願いします。
乱数をこの前習ったところです。
ランダムな数はrand()を呼べば出来ると思うんですけど、
1~10のランダムな数はどうやればいいんでしょう?
今のままでは大きな数も表示されてしまうんです。
それとか1個飛びのランダムな数とか自由に作るテクとかあれば教えてください。
Re:乱数
Posted: 2006年12月20日(水) 12:51
by バグ
こんにちは
1~10の乱数の作り方です。
rand() % 10 + 1;
10で割った余りというのは必ず0~9の範囲におさまりますよね?
それに1足してやれば、1~10の数になる訳です。
1個飛びの乱数というのがイマイチよく分からないのですが、奇数か偶数かという事でしょうか?(^_^;)
Re:乱数
Posted: 2006年12月20日(水) 13:15
by 管理人
こんにちは^^
普段数学とかしていると「余り」って言葉とほとんど縁がないので親しみが無いかもしれませんが、
プログラムで乱数使ったり、時間変化する変数使ったりする時には
よく出てきます。
乱数の使い方はバグさんのおっしゃるとおりです。
例えば0から無限大へ増加するint型のカウンターの値があるとしますよね。
その変数を使って、10枚の画像をループして表示したい時とか、よくあるんですよ。
if(counter>10) counter=0;
else counter++;
とかけばいいでしょうけど、カウンターの値は他でも使うので、ここで操作できません。
そんな時、counter%10をすると0~9の値が出せるんです。
・・・って余計な事ですね^^;
1個とびって言うのがバグさんのおっしゃる奇数偶数って事でしたら
0~99の範囲で偶数を出すなら
(rand() % 100) * 2
ですし、奇数ならそれに+1すればOKです。
>自由に作るテクとかあれば教えてください。
テク・・・っていうか慣れじゃないでしょうか?
それか、数式に一度あらわしてみるとかいいかもしれません。
偶数ってよく2mとかってあらわしますよね。奇数は2m+1とか。
今回mの部分が(rand()%100)なわけです。
プログラムの中で、よりスマートに書くためにどうかこうか悩んだりすることはよくあります。
そんな時、ちっとも考えないで答えを見るより、自分で試行錯誤して見つけ出した答えの方がずっとよく定着しますので。
しっかり悩むことも重要だと思いますw
Re:乱数
Posted: 2006年12月20日(水) 13:33
by バグ
>>管理人さん
偶数 = rand() % 50 * 2
奇数 = rand() % 50 * 2 + 1
ではないですか?
Re:乱数
Posted: 2006年12月20日(水) 13:39
by 管理人
はい、その通りです(_ _|||)
Re:乱数
Posted: 2006年12月20日(水) 13:52
by Justy
ついでなんで、もう1つの1~10の乱数の作り方も。
[color=#d0d0ff" face="monospace]
// rand()を使って 0.0~1.0未満の値に正規化するマクロ
#define Random() (double)(rand() * (1.0 / ((double)RAND_MAX + 1.0)))
[/color]
こんなマクロを定義しておいて、使うときに
[color=#d0d0ff" face="sans-serif]
Random() * N + 1[/color]
とすると1~Nになります。
最初のマクロは rand()が返す整数の最大値が RAND_MAXであることを利用して、
rand() / (RAND_MAX+1)を行うことで0~1未満の数を計算しています。
後はその値を元に、10倍して1を足すことで1~10を実現しています。
# 利点は rand()内部の
http://www001.upp.so-net.ne.jp/isaku/rand.htmlをある程度改善できること、 RAND_MAXの値にかかわらず、ある程度大きな数であってもそれなり乱数になる、ということです。
欠点は計算に整数ではなく浮動小数点数型を利用するので、浮動小数点数の計算が遅いマシンでは多用できないことです。
Re:乱数
Posted: 2006年12月20日(水) 14:21
by 管理人
なるほど~!下位ビットは使わないほうがいいっていいますもんね。
そういえば、マシンの高速化が進んでいる現在、ソートより、よりよい乱数を考えたほうが需要が多いかもしれませんねw