はじめまして。よろしくお願いします。
乱数をこの前習ったところです。
ランダムな数はrand()を呼べば出来ると思うんですけど、
1~10のランダムな数はどうやればいいんでしょう?
今のままでは大きな数も表示されてしまうんです。
それとか1個飛びのランダムな数とか自由に作るテクとかあれば教えてください。
乱数
Re:乱数
こんにちは^^
普段数学とかしていると「余り」って言葉とほとんど縁がないので親しみが無いかもしれませんが、
プログラムで乱数使ったり、時間変化する変数使ったりする時には
よく出てきます。
乱数の使い方はバグさんのおっしゃるとおりです。
例えば0から無限大へ増加するint型のカウンターの値があるとしますよね。
その変数を使って、10枚の画像をループして表示したい時とか、よくあるんですよ。
そんな時、counter%10をすると0~9の値が出せるんです。
・・・って余計な事ですね^^;
1個とびって言うのがバグさんのおっしゃる奇数偶数って事でしたら
0~99の範囲で偶数を出すなら
(rand() % 100) * 2
ですし、奇数ならそれに+1すればOKです。
>自由に作るテクとかあれば教えてください。
テク・・・っていうか慣れじゃないでしょうか?
それか、数式に一度あらわしてみるとかいいかもしれません。
偶数ってよく2mとかってあらわしますよね。奇数は2m+1とか。
今回mの部分が(rand()%100)なわけです。
プログラムの中で、よりスマートに書くためにどうかこうか悩んだりすることはよくあります。
そんな時、ちっとも考えないで答えを見るより、自分で試行錯誤して見つけ出した答えの方がずっとよく定着しますので。
しっかり悩むことも重要だと思いますw
普段数学とかしていると「余り」って言葉とほとんど縁がないので親しみが無いかもしれませんが、
プログラムで乱数使ったり、時間変化する変数使ったりする時には
よく出てきます。
乱数の使い方はバグさんのおっしゃるとおりです。
例えば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:乱数
ついでなんで、もう1つの1~10の乱数の作り方も。
[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の値にかかわらず、ある程度大きな数であってもそれなり乱数になる、ということです。
欠点は計算に整数ではなく浮動小数点数型を利用するので、浮動小数点数の計算が遅いマシンでは多用できないことです。
[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の値にかかわらず、ある程度大きな数であってもそれなり乱数になる、ということです。
欠点は計算に整数ではなく浮動小数点数型を利用するので、浮動小数点数の計算が遅いマシンでは多用できないことです。