- ベストアンサー
エクセルで100マスの乱数表を作るには
エクセルで縦10×横10の計100マスで、1から100までの数字(数字の重複なし)で乱数表を作るにはどうすれば良いか。
- みんなの回答 (12)
- 専門家の回答
質問者が選んだベストアンサー
VBAでやるのが簡単です。以下は重複の無い乱数発生のVBAサンプルです。 【手順】 1. [Alt]+[F11]で Visual Basic Editor(以下VBE)起動 2. [挿入]-[標準モジュール]クリック 3. 下記VBAコードをコピー&ペースト 4. VBEを閉じる 5. [ツール]-[マクロ]-[マクロ]で実行 【VBAコード】(次行から終わりまで) '10×10の重複しない乱数表 Sub Sample() Dim NumberBuf%(1 To 10, 1 To 10) Dim intNum%, i%, j%, ItemNum% Dim tmpBuf Dim Dic As Object 'Dictionaryオブジェクト生成 Set Dic = CreateObject("Scripting.Dictionary") 'Dictionaryの登録数が100になるまでループ Do Until Dic.Count = 100 '1~100までの整数で乱数発生 intNum = Int((100 * Rnd) + 1) 'Dictionaryに登録されているか? If Not Dic.Exists(intNum) Then '登録されていなければ追加 Dic.Add Key:=intNum, Item:=Empty End If Loop tmpBuf = Dic.Keys '乱数を10×10の配列に代入 ItemNum = 0 For i = 1 To 10 For j = 1 To 10 NumberBuf(i, j) = tmpBuf(ItemNum) ItemNum = ItemNum + 1 Next j Next i '転記先を変えるにはRange("A1")のA1の部分を変更 '10×10のセル範囲左上角のセルになります Range("A1").Resize(10, 10).Value = NumberBuf End Sub
その他の回答 (11)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
乱数を作る方法で、(重複する値を最初から排除するために)よく値を交換する方法がでてくるけど、 一般的には、交換する方法では均等な乱数が得られない。 例えば、 A,B,Cという3つの値が有った時に、 交換元の値をランダムに3つから1つ選び 交換先の値をランダムに3つから1つ選んだとすると 交換される組み合わせは全てで9通りある。 ところが、A,B,C3つを並べる組み合わせは6通りだから交換の結果は均等な結果にならない。 参考までに。
お礼
BLUEPIXY様、このたびは愚問にもかかわらずご丁寧にご返答頂きまことにありがとうございました。おかげ様で問題は無事解決いたしました。ご教授に深く感謝申し上げます。
#10また間違ってしまった。 > For i = 1 to SHUFFLE_TIME_time For i = 1 to SHUFFLE_TIME でした。
なんだかVBAが盛り上がってきたみたいなので自分も書いちゃいます。考え方としては 1. 配列に1~100を順番に入れておく 順番に入れておくので重複はあり得ない。したがって重複チェックは必要ない。重複チェックをすると後にいくほどretryが増えるので時間がかかります。 2. 配列の2要素の値を入れ換える 配列のm番目とn番目の値を入れ換える。mとnはRnd関数で決める。たまたまmとnが同じでもエラーにはならない(同じ値を代入するだけなので)。 3. 配列の値をA1のセルから順番に入れていく 実際に書くとこんな感じ。でもExcel持ってないので確認できない。細かいところで間違ってるかも(考え方はいいと思う)。 Private Sub make_table() Dim numbers(100) As Integer Dim swapindex(2) As Integer Dim tmpval As Integer Dim i As Integer Const SHUFFLE_TIME = 1000 ' シャッフルする回数(この値は適当に決める) ' 配列numbersに1から100までの数値をいれる(この時点では順番どおり) For i = 0 to 99 numbers(i) = i + 1 Next ' 配列の値をSHUFFLE_TIMEの回数入れ換える For i = 1 to SHUFFLE_TIME_time swapindex(0) = numbers(Int(Rnd * 100)) swapindex(1) = numbers(Int(Rnd * 100)) tmpvalue = numbers(swapindex(0)) numbers(swapindex(0)) = numbers(swapindex(1)) numbers(swapindex(1)) = tmpvalue Next ' 配列の値を順番にセルに入れる(ここではA1から右に続くようにした) For i = 0 to 99 Cells(((i \ 10) + 1), ((i mod 10) + 1)).Value = numbers(i) Next End Sub
- kigoshi
- ベストアンサー率46% (120/260)
VBAでのソース例です。 Private Sub 乱数() Dim rIdx As Integer Dim cIdx As Integer Dim rRnd As Integer Dim cRnd As Integer Dim pivN As Integer For rIdx = 1 To 10: For cIdx = 1 To 10 Cells(rIdx, cIdx).Value = cIdx + (rIdx - 1) * 10 Next: Next For rIdx = 1 To 10: For cIdx = 1 To 10 rRnd = Int(Rnd * 10) + 1 cRnd = Int(Rnd * 10) + 1 pivN = Cells(rIdx, cIdx).Value Cells(rIdx, cIdx).Value = Cells(rRnd, cRnd).Value Cells(rRnd, cRnd).Value = pivN Next: Next End Sub
お礼
kigoshi様、このたびは愚問にもかかわらずご丁寧にご返答頂きまことにありがとうございました。おかげ様で問題は無事解決いたしました。ご教授に深く感謝申し上げます。
- harukabcde
- ベストアンサー率15% (94/610)
エクセル 100マス計算 で検索してみました http://www.google.com/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLD,GGLD:2004-11,GGLD:ja&q=%E3%82%A8%E3%82%AF%E3%82%BB%E3%83%AB%E3%80%80%EF%BC%91%EF%BC%90%EF%BC%90%E3%83%9E%E3%82%B9%E8%A8%88%E7%AE%97
お礼
harukabcde様、このたびは愚問にもかかわらずご丁寧にご返答頂きまことにありがとうございました。おかげ様で問題は無事解決いたしました。ご教授に深く感謝申し上げます。
- tresbien
- ベストアンサー率51% (51/99)
No4です ごめんなさい。上手くいかないですね。 値が重複します。
#3です。間違いがありました。 > あとは100x100の表に貼りつける。 10x10の表でした。 ちなみに#3のやりかただと値が重複することはありません。
- tresbien
- ベストアンサー率51% (51/99)
A1:A100に1から100まで入力する。 B1:B100にはすべて0.01を入力する(発生確率です) この準備をしてツール-分析ツール-乱数発生を使います。 分布のボックスで離散を選び、値と確率の範囲を先のA1:B100にすればいいです。 出力範囲はあなたの好きな10行10列の100個のセルを指定します。
お礼
tresbien様、このたびは愚問にもかかわらずご丁寧にご返答頂きまことにありがとうございました。おかげ様で問題は無事解決いたしました。ご教授に深く感謝申し上げます。
1. A1~A100に1~100の数字を入力 2. B1~B100に"=rand()"を入力 3. B1~B100をコピーしてC1~C100に「形式を選択して貼り付け」で値のみ貼り付け。 4. C列で並び替え これでA列がランダムに並ぶ。あとは100x100の表に貼りつける。再計算すればB列の値が変わるのでふたたび3,4を行えばいくらでも表が作れる。3と4の手順をマクロで登録しておくと便利。 VBAが使えればもっとスマートになるけどね。
お礼
masapee様、このたびは愚問にもかかわらずご丁寧にご返答頂きまことにありがとうございました。おかげ様で問題は無事、完璧に、解決いたしました。さすがです。すばらしいです。ご教授に深く感謝申し上げます。
- POKIE
- ベストアンサー率33% (266/784)
こんにちは すべてのセルに =RAND() を入力。これですべてのセルに0~1の乱数が入力されました。(ここではA1:J10としておきます。) 次に別の場所に =RANK(A1,$A$1:$J$10) と入力し、同じく10X10セル分ドラッグすればそのセルの順番が、1~100まで出せます。 注意点 1、理論的に数値が重複することがあるのかもしれないですが(よくわかりません)、100マス程度では問題ないかと思います。 2、ほかのセルを触るごとに数値が自動計算されるのがうっとうしい。(意味がわからないと思いますが、やってみればわかります)
お礼
POKIE様、このたびは愚問にもかかわらずご丁寧にご返答頂きまことにありがとうございました。おかげ様で問題は無事解決いたしました。ご教授に深く感謝申し上げます。
- 1
- 2
お礼
KENKENSP様、このたびは愚問にもかかわらずご丁寧にご返答頂きまことにありがとうございました。おかげ様で問題は無事、完全に解決いたしました。さすがでございます。恐れ入りました。ご教授に心から深く深く感謝申し上げます。