プロが教える店舗&オフィスのセキュリティ対策術

エクセルで縦10×横10の計100マスで、1から100までの数字(数字の重複なし)で乱数表を作るにはどうすれば良いか。

A 回答 (12件中1~10件)

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
    • good
    • 1
この回答へのお礼

KENKENSP様、このたびは愚問にもかかわらずご丁寧にご返答頂きまことにありがとうございました。おかげ様で問題は無事、完全に解決いたしました。さすがでございます。恐れ入りました。ご教授に心から深く深く感謝申し上げます。

お礼日時:2005/02/27 18:16

乱数を作る方法で、(重複する値を最初から排除するために)よく値を交換する方法がでてくるけど、


一般的には、交換する方法では均等な乱数が得られない。
例えば、
A,B,Cという3つの値が有った時に、
交換元の値をランダムに3つから1つ選び
交換先の値をランダムに3つから1つ選んだとすると
交換される組み合わせは全てで9通りある。
ところが、A,B,C3つを並べる組み合わせは6通りだから交換の結果は均等な結果にならない。
参考までに。
    • good
    • 0
この回答へのお礼

BLUEPIXY様、このたびは愚問にもかかわらずご丁寧にご返答頂きまことにありがとうございました。おかげ様で問題は無事解決いたしました。ご教授に深く感謝申し上げます。

お礼日時:2005/02/27 18:17

#10また間違ってしまった。



> For i = 1 to SHUFFLE_TIME_time
For i = 1 to SHUFFLE_TIME でした。
    • good
    • 0

なんだか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
    • good
    • 0

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
    • good
    • 0
この回答へのお礼

kigoshi様、このたびは愚問にもかかわらずご丁寧にご返答頂きまことにありがとうございました。おかげ様で問題は無事解決いたしました。ご教授に深く感謝申し上げます。

お礼日時:2005/02/27 18:14

エクセル 100マス計算


で検索してみました

http://www.google.com/search?sourceid=navclient& …
    • good
    • 0
この回答へのお礼

harukabcde様、このたびは愚問にもかかわらずご丁寧にご返答頂きまことにありがとうございました。おかげ様で問題は無事解決いたしました。ご教授に深く感謝申し上げます。

お礼日時:2005/02/27 18:12

No4です


ごめんなさい。上手くいかないですね。
値が重複します。
    • good
    • 0

#3です。

間違いがありました。

> あとは100x100の表に貼りつける。
10x10の表でした。

ちなみに#3のやりかただと値が重複することはありません。
    • good
    • 0

A1:A100に1から100まで入力する。


B1:B100にはすべて0.01を入力する(発生確率です)
この準備をしてツール-分析ツール-乱数発生を使います。
分布のボックスで離散を選び、値と確率の範囲を先のA1:B100にすればいいです。
出力範囲はあなたの好きな10行10列の100個のセルを指定します。
    • good
    • 0
この回答へのお礼

tresbien様、このたびは愚問にもかかわらずご丁寧にご返答頂きまことにありがとうございました。おかげ様で問題は無事解決いたしました。ご教授に深く感謝申し上げます。

お礼日時:2005/02/27 18:11

1. A1~A100に1~100の数字を入力


2. B1~B100に"=rand()"を入力
3. B1~B100をコピーしてC1~C100に「形式を選択して貼り付け」で値のみ貼り付け。
4. C列で並び替え

これでA列がランダムに並ぶ。あとは100x100の表に貼りつける。再計算すればB列の値が変わるのでふたたび3,4を行えばいくらでも表が作れる。3と4の手順をマクロで登録しておくと便利。

VBAが使えればもっとスマートになるけどね。
    • good
    • 0
この回答へのお礼

masapee様、このたびは愚問にもかかわらずご丁寧にご返答頂きまことにありがとうございました。おかげ様で問題は無事、完璧に、解決いたしました。さすがです。すばらしいです。ご教授に深く感謝申し上げます。

お礼日時:2005/02/27 18:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!