パスワードを忘れた? アカウント作成
667376 journal

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

まあ、この関数も幾らでも突っ込みどころはあると思うので思い
っきり突っ込んで良し。
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • ln_seedも元をたどれば時刻(time(NULL))に依存しているわけで、単純なsrand(time(NULL))をやった場合と違う乱数系列ながらも、同じ時刻だと同じ乱数系列になってしまうんじゃないでしょうか。

    うーん、何かやるたびにfset_randを呼ぶんでしょうか? それとも並行して走ってる別のプロセスで同じ乱数系列が出てきてしまうということでしょうか。

    同じプロセスの中であれば、srand(time(NULL))は一度だけ呼べばよいです。あとは適当に乱数が発生します(乱数の品質についてはここでは触れません。議論できるほど知識ないし :)。

    別のプロセスであれば、時刻だけじゃなくてプロセス番号やら、/dev/randomとかを加味してやはり一度だけsrandを呼べばよいと思います。
typodupeerror

計算機科学者とは、壊れていないものを修理する人々のことである

読み込み中...