• 締切済み

乱数みたいに

BigFootの回答

  • BigFoot
  • ベストアンサー率31% (16/51)
回答No.2

rand()を使って、重なりを出さずに、1~40の配列を40作る一例です。 この方法は、最初に1~40の数字の配列を作成しておいて、 ランダムにその中から数字を選び、選ばれた数字をその配列から削除し、 残った数字の中からランダムに選び.....を繰り返すやり方です。 ほかにも色々なやり方がありますが、何か参考になれば、幸いです。 char buf[40][40]; char chk[40]; char now[40]; int n, i, k, cnt, rdt; for( n=0; n<40; ){ for( i=0; i<40; i++ ){ chk[i] = i+1; //取り出しテーブルの作成 } for( cnt=0,k=40; k>1; ){ do{ rdt = rand() % k; }while( rdt < 0 ); //取り出し位置の取得 now[cnt++] = chk[rdt]; //選択データの保存 k--; while( rdt < k ){ //選択データを外すループ chk[rdt] = chk[rdt+1]; rdt++; } } for( i=0; i<n; i++ ){ if( memcmp( buf[i], now, 40 ) == 0 ){//作成した配列のチェック break; } } if( i==n ){ memcpy( buf[n], now, 40 ); //乱数配列の登録 n++; } }

関連するQ&A

  • 1から9までの乱数

     エクセルで1から9までの数を順不同に毎回取り出せる関数はどうしたらいいのでしょう。たとえば  135624897や987456123の様に数字を並べたいと思います。

  • 正規乱数とは

    学校の宿題ですがまず正規乱数の発生は2つの方法があるというのですが、意味がわかりません。 正規乱数でなんですか。 なぜ12個足して6をひくのですか。 また逆関数法の=NORMSINV(RAND()) てどういう意味ですか。 正規乱数の発生 1 一様乱数を12個足して6を引く方法 =RAND()+RAND()+・・・・+RAND() - 6 12個分 2 逆関数法 =NORMSINV(RAND())

  • エクセルで0超1未満の乱数を発生する方法

    タイトルの通りです。 EXCELのRAND関数は0以上1未満の乱数を発生しますが、0超1未満の乱数を作る方法を教えて下さい。 確率の検証用に乱数を作りたいのですが、0や1(0%や100%)は除きたいのです。もちろん非常に小さい数でも0でなければ採用したいのですが0だけはダメです。 実用上、RANDでも0は殆ど出ないとは思いますが…あるいは乱数を発生させておいて0になった時だけ再計算させれば良いのかもしれませんが、出来れば再計算無しで最初からそうしたいのです。

  • EXCELで乱数表示に条件を加えたいのですが...

    1から10までの数をA1~A10のセルに重複なしでランダムに表示する際に, 今まで,RAND関数,RANK関数,RANDBETWEEN関数,sortedlistクラスなどを使っていました. そこに,A1には2はダメ!,A2には4はダメ! … というように,各セルで表示される数を制限 した下でランダム表示したいのですが,どのようにすればいいか思いつきません... 良い考えがあれば,是非教えて下さい.お願いします.

  • エクセルで、乱数の関数 同じ数が無いように

    乱数を発生させる関数で、RAND関数は、小数点(0~1の間)で、RANDBETWEEN関数は整数で出るとのことですが、RANDBETWEEN関数は同じ数字がいくつか重複して出ます。整数で同じ数が出ないようにする関数はないでしょうか?

  • 乱数と順列と組み合わせ

    初心者です。MacPerlを使っています。 Perlを使って、例えば9個の文字の中から4個を選ぶ、という組み合わせを、すべてのパターンについてもれなく行うことはできますか? 完全にランダムなものはできました。(例えば、3個の文字を使って4文字からなる配列をすべて(3^4=81通り)作る、など。ひたすら作って同じ配列を消す、というあまり美しくない方法ですが・・・) ですが、rand関数を使うと、同じものが出てきてしまうことがあるので、数学でいうところのcombinationをつくることができずにいます。 permutationはなんとかできたのですが。。(これもやはり、同じものを消せばいいので。) combinationの場合、「並び方」は問わないので、同じ要素からなるが順列が異なる配列を同じものとして消したいのです。 どなたかその方法がわかる方はいらっしゃいますか?

    • ベストアンサー
    • Perl
  • 標準正規分布の乱数

    RAND()関数は ((double)rand() / (1.0 + RAND_MAX))と定義します。 中心極限定理により、一様乱数を足し合わせると正規分布に近づくことから、 x = 分散 * (Σ[1~12]RAND() - 6) + 平均 で正規乱数が作れる。標準正規分布は分散1、平均0なのでその乱数は x = Σ[1~12]RAND() - 6 ですよね。この乱数を例えば100個羅列するにはどうしたらいいのでしょうか? もし間違ってたら指摘してください。 参考文献「Cによるシミュレーションプログラム 石川宏」 #include <stdio.h> #include <stdlib.h> #define RAND() ((double)rand() / (1.0 + RAND_MAX)) #define NUMBER 10000 /* 発生させる乱数の数 */ main(void) { int j; double u, x; srand(5); for (j = 0; j <= 11; j++) { u = u + RAND(); } x = u - 6.0; }

  • 乱数の生成方法

    乱数を生成するソースコードを探しています rand関数で生成される乱数はよい乱数ではないようで それ以外でいい乱数を生成する方法はどのようなものがあるのでしょうか また、実装したソースコードのサンプルがあればWEBページなどを教えていただきたいです

  • 乱数の利用

    よろしくお願いします。 エクセル、あるいは同様の表計算ソフトには乱数の関数がありますが、 実際に利用された経験がある方がいらっしゃいましたら、 何にどのように利用されたかを教えてください。 ちなみに、私の場合は、大学時代に物理のシミュレーションをやった以外ですと、 あらかじめ、RAND関数とRANK関数を使った表を作っておき、 このQ&Aサイトでアンケートの質問を投稿して、ベストアンサーを決定する際、 その日の日付の数だけ再計算ボタンを押して(6月17日なら17回)、 順位がいちばん上になった番号の回答をベストアンサーにする、といった用途ぐらいです。 ですので、もっと実用的で有効な応用があれば、知りたいです。 生活に密着したことから、趣味、お仕事あるいは高度な応用まで、様々なご回答を歓迎いたします。

  • Excelで文字列を独自の二進数で表したい。

    A,B,C,D,Eのいずれかを含む文字が順不同でセルに入っているものから、 A=10000 B=1000 C=100 D=10 E=1 と置換して足した、二進数であらわしたり、逆にその二進数から文字列に戻したりしたいです。 (例:DAなら10010、EBCなら1101) VBAの自作関数を含めてExcelの関数でできる方法があればお教えくださると助かります。