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

乱数みたいに

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

noname#591
noname#591

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

  • 回答数3
  • 閲覧数105
  • ありがとう数6

みんなの回答

  • 回答No.3

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

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

関連するQ&A

  • 1から9までの乱数

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

  • 正規乱数とは

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

  • 乱数について

    rand関数で乱数を作る時に、この関数は0~RAND_MAXの擬似乱数を作りますが、 この擬似乱数を特定の範囲だけ作ることは可能なのでしょうか? 例えば、30~70までの擬似乱数だけを作るとかです。 よろしくお願いします。

  • 回答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

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

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

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

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

  • 乱数をC言語で

    乱数をC言語でプログラムしたいのですが、 rand関数を使わずに作らなきゃいけないという事なんですが 一度作ってはみたもののうまく乱数にできずに困っています できれば教えていただきたいです

  • 乱数関数について

    「エクセルの乱数関数を用いて、0~1の乱数を100個発生させなさい」という問題があるんですが、どうしてもわかりません。RANDをつかうらしいですが。ぜひとも教えてください。

  • 標準正規分布の乱数

    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関数とRANK関数を使った表を作っておき、 このQ&Aサイトでアンケートの質問を投稿して、ベストアンサーを決定する際、 その日の日付の数だけ再計算ボタンを押して(6月17日なら17回)、 順位がいちばん上になった番号の回答をベストアンサーにする、といった用途ぐらいです。 ですので、もっと実用的で有効な応用があれば、知りたいです。 生活に密着したことから、趣味、お仕事あるいは高度な応用まで、様々なご回答を歓迎いたします。

  • 乱数の度数分布を調べたいC言語

    乱数の度数分布をしらべたいのですがうまくいきません。 grand()は標準正規分布の乱数です。(検索してコピペしたものです。) すいませんが、ご教授お願いします。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define RAND() ((double)rand() / (1.0 + RAND_MAX)) double grand(); main(void){ int j, N, n[6]; double x; N=1000; for (j = 1; j <= N; j++) { x = grand(); if(-1.5< x <= -1.0){n[0] = n[0] + 1;} if(-1.0< x <= -0.5){n[1] = n[1] + 1;} if(-0.5< x <= 0.0){n[2] = n[2] + 1;} if(0.0< x <= 0.5){n[3] = n[3] + 1;} if(0.5< x <= 1.0){n[4] = n[4] + 1;} if(1.0< x <= 1.5){n[5]= n[5] + 1;} } printf(" %d \n %d \n %d \n %d \n %d \n %d \n", n[0], n[1], n[2], n[3], n[4], n[5]); return 0; } double grand() { static double V1, V2, S; static int phase = 0; double X; if(phase == 0) { do { double U1 = RAND(); double U2 = RAND(); 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; }

  • MATLABの乱数生成関数 rand( ) について

    一様乱数を生成する関数rand()について  ・Y = rand(n);  ・rand('state',sum(100*clock));   Y = rand(n); という2つのやり方があるようなのですが,以下のmatlabの関数の説明 のページをみても2つの違いが理解できません. http://infoshako.sk.tsukuba.ac.jp/ShakoDoc/MATLAB5/jhelp/techdoc/ref/rand.html どういう違いがあるのでしょうか? また,この関数は[0,1]の一様乱数としていますが,[-a,a]みたいに範囲指定はできないのでしょうか? 回答よろしくお願いします.

  • エクセルで3ケタの乱数

    今度くじ引き大会をするのに3ケタの数字を250名ほどに配りたいのですが、それぞれの数字が重複なくかつ各桁数の数字が重複しないで乱数をエクセルで生成する方法を教えてください。(例えば、101,221,199などは除外したいです) RAND,RANDBETWEEN関数を使ってみましたが、重複してしまうし、221などのような各桁で数字が重複してしまうものができてしまうのでうまくいきません。 よろしくお願いします。

  • rand()の乱数は何故良くないの?

    Cに標準で使える乱数の関数はそのままで使うなとよく聞きます。 自分でもこの辺とか読んでみたんですけど、 http://www001.upp.so-net.ne.jp/isaku/rand.html gccについては何故よくないかわかりました。 下位ビットを見ると0と1が交互に出てくるんですね。 私はVC++を使っているのですがそれでも良くないんでしょうか? 具体的にどのようにVC++のrandは良くないんでしょうか。 書き足らない部分があれば補足します、よろしくお願いします。

専門家に質問してみよう