kurokumaの日記: c++ ? 2
日記 by
kurokuma
時間が変わらんと同じカードしか出ん
皆さんの意見を取り入れ新しいバージョンを作ってみた、c++ 見
たくはまだ出来ないんで define して、最初にカードを作成して、
初期化をいれてみただけ(ソースは省略、今回の問題はそこでは
ないので)。
ところが、最初にカード作成すると、複数のカードを用意したい
場合に time が変わらない限り同じ順番のカードしか作れない。
最初に私が作成した奴だと、どちらかのカードを呼ぶ度に rand
がかかるため、たまたま違う順番のカードが出てていた。
なので srand にちょっと手を加えて関数にしてみた、以下が
それ。
void fset_rand(){
int ln_time;
int ln_rand;
int ln_seed;
ln_time = time(NULL);
ln_rand = rand();
if (ln_time > ln_rand){
ln_seed = ln_time - ln_rand;
}else{
if (ln_rand > ln_time){
ln_seed = ln_rand - ln_time;
}else{
ln_seed = ln_time;
}
}
srand(ln_seed);
}
実はもともとは、乱数の発生の勉強のためにたまたまカードを題
材に選んだんだが、この部分に限って言えば c++ である必要性
が全く無いことに気づいた、なにやってんだ俺(w
まあ、この関数も幾らでも突っ込みどころはあると思うので思い
っきり突っ込んで良し。
皆さんの意見を取り入れ新しいバージョンを作ってみた、c++ 見
たくはまだ出来ないんで define して、最初にカードを作成して、
初期化をいれてみただけ(ソースは省略、今回の問題はそこでは
ないので)。
ところが、最初にカード作成すると、複数のカードを用意したい
場合に time が変わらない限り同じ順番のカードしか作れない。
最初に私が作成した奴だと、どちらかのカードを呼ぶ度に rand
がかかるため、たまたま違う順番のカードが出てていた。
なので srand にちょっと手を加えて関数にしてみた、以下が
それ。
void fset_rand(){
int ln_time;
int ln_rand;
int ln_seed;
ln_time = time(NULL);
ln_rand = rand();
if (ln_time > ln_rand){
ln_seed = ln_time - ln_rand;
}else{
if (ln_rand > ln_time){
ln_seed = ln_rand - ln_time;
}else{
ln_seed = ln_time;
}
}
srand(ln_seed);
}
実はもともとは、乱数の発生の勉強のためにたまたまカードを題
材に選んだんだが、この部分に限って言えば c++ である必要性
が全く無いことに気づいた、なにやってんだ俺(w
まあ、この関数も幾らでも突っ込みどころはあると思うので思い
っきり突っ込んで良し。
何をやりたいのかよくわからんのですが (スコア:1)
うーん、何かやるたびにfset_randを呼ぶんでしょうか? それとも並行して走ってる別のプロセスで同じ乱数系列が出てきてしまうということでしょうか。
同じプロセスの中であれば、srand(time(NULL))は一度だけ呼べばよいです。あとは適当に乱数が発生します(乱数の品質についてはここでは触れません。議論できるほど知識ないし :)。
別のプロセスであれば、時刻だけじゃなくてプロセス番号やら、/dev/randomとかを加味してやはり一度だけsrandを呼べばよいと思います。
理解できました (スコア:1)
の最初で一回呼べば済む話ですね。
ありがとうございます、勉強になりました。