• 締切済み
  • 暇なときにでも

乱数みたいに

1から40までの数を順不同で出したいのです。 RAND関数だと重なりができてしまいますよね。 それなしで、なにかよい関数・方法はございますでしょうか。 かつ、それを40通り作りたいのです。 きっとIF関数とかを使うのでしょうが、私は思い浮かばないのです。 お願いいたします!

noname#591
noname#591

共感・応援の気持ちを伝えよう!

みんなの回答

  • 回答No.3

皆さんなぜかCで書かれてますが・・・ココはOfficeシリーズのカテゴリですよね? VBAのサンプルは書きませんが、考え方は配列を使えば何とかなるってことで、他の 方と同じです。 40個の配列を作って、それぞれの要素をランダムに置き換えたり、ソースとなる 配列から乱数で読み出す要素を選んで、必要な40×40の配列に収めるって感じ ですね。前者のほうが楽かな? もう一ひねりして、1つ目の40配列を造ったら、それを2つ目にコピーして再度 ランダムに置き換え、2つ目を3つ目にコピーしてランダムに置き換え・・・ って感じにすれば、ダブることは少ないと思いますね。 置き換えするときも2つの要素番号を乱数で決めたり、置き換える回数を乱数で決 めるとか、色々工夫してみたらいかがでしょう?

共感・感謝の気持ちを伝えよう!

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

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++; } }

共感・感謝の気持ちを伝えよう!

  • 回答No.1

以下のBoxとMullerの方法(極座標法)はKnuthご推薦である。 #include <stdlib.h> #include <math.h> double gaussrand() { static double V1, V2, S; static int phase = 0; double X; if(phase == 0) { do { double U1 = (double)rand() / RAND_MAX; double U2 = (double)rand() / RAND_MAX; V1 = 2 * U1 - 1; V2 = 2 * U2 - 1; S = V1 * V1 + V2 * V2; } while(S >= 1 || S == 0); X = V1 * sqrt(-2 * log(S) / S); } else X = V2 * sqrt(-2 * log(S) / S); phase = 1 - phase; return X; }

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • 1から9までの乱数

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

  • 正規乱数とは

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

  • 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の関数でできる方法があればお教えくださると助かります。

  • 文字列の組み合わせ数を調べる方法

    図のような表の中から、文字列の組み合わせ数を調べる方法をご教示ください。 順序を問う組み合わせと順不同な組み合わせの2通りの数を調べたいです。 またこの場合はD列に結合した文字列を入れたほうが処理が簡単になるでしょうか(例:D1「CAB」)。 なおデータ数(行)は増える可能性がありますが、一行の文字数(列)は増えません。 図の場合だと、「PHW」の順序を問う組み合わせ数は「3」、順不同な組み合わせは「4」です。