エクセルで30行に0-4の間の乱数を発生させて合計数を常に100にするにはどうすればいいのでしょうか。
VBAではないのですがやりたいことはCのほうの過去ログにあったのですが
http://oshiete1.watch.impress.co.jp/qa4035587.html
見ても全くわかりませんでした。
No.3ベストアンサー
- 回答日時:
>エクセルで30行に0-4の間の乱数を発生させて合計数を常に100
乱数 個数 合計
0 0
1 0
2 0 0
3 20 60
4 10 40 0から4の数値、30個の合計が100になる為には
───────── 4の数値が最低限10個、必要
30 100
4の出る確率を上げてみました。
Sub Test()
Dim v(29)
Dim i As Long, n As Long
Randomize
Do
For i = 0 To 29
n = Int(Rnd() * 8)
If n > 4 Then n = 4
v(i) = n
Next
Loop Until Application.Sum(v) = 100
Range("A1").Resize(30).Value = Application.Transpose(v)
End Sub
数値を変えてもうまく動きました。教えいただきありがとうございます。簡潔なのと回答が早かったのでこちらをBAにさせていただきました。他の方も教えていただきありがとうございました。
No.4
- 回答日時:
おもしろそうだったのでやってみました。
やってみたのは3パターン
・「test1」
乱数でどこに、乱数で何(値 1 ~ 4)を、を求めて
値を設定しないところは 0 のまま
・「test2」
乱数でどこに、を求めて 1 を加算していく
最悪無限ループに陥るかも
・「test3」
test2 の改良バージョン
傾向としては、
test1 は、最大値がでやすい?(乱数でどこ・・・が同じなら加算していたので)
test2 / test3 は平均されやすい?(乱数の発生頻度と同じ?)
0 の出現は、 test2 / test3 では少ない様な気がします。
(乱数なので、そういうものとしても良いのかも)
While 内の実行回数の少ない順(変数 k の値)は、
test1(100回以下) < test3(100回) < test2(100回以上)
の様な感じ(雰囲気で)
説明は省いても良いですかね
確かめられるのであれば、
Const CNUMSUM As Long = 100 ' 合計値
Const CROWMAX As Long = 30 ' 行数
Const CNUMMAX As Long = 4 ' 最大値
の値を変更して、
CROWMAX * CNUMMAX > CNUMSUM になっていればソコソコ動くと思います。
Public Sub test1()
Const CNUMSUM As Long = 100
Const CROWMAX As Long = 30
Const CNUMMAX As Long = 4
Dim iAry(1 To CROWMAX) As Long
Dim i As Long, k As Long
Dim iNum As Long, iR As Long
Randomize
For i = 1 To CROWMAX
iAry(i) = 0
Next
k = 0
iNum = CNUMSUM
While (iNum > 0)
k = k + 1
i = Int(CROWMAX * Rnd()) + 1
iR = Int((CNUMMAX) * Rnd()) + 1
If (iAry(i) + iR > CNUMMAX) Then iR = CNUMMAX - iAry(i)
If (iR > iNum) Then iR = iNum
iAry(i) = iAry(i) + iR
iNum = iNum - iR
Wend
Debug.Print "k = " & k
Range("A1").Resize(CROWMAX) = _
WorksheetFunction.Transpose(iAry)
End Sub
Public Sub test2()
Const CNUMSUM As Long = 100
Const CROWMAX As Long = 30
Const CNUMMAX As Long = 4
Dim iAry(1 To CROWMAX) As Long
Dim i As Long, k As Long
Dim iNum As Long
Randomize
For i = 1 To CROWMAX
iAry(i) = 0
Next
k = 0
iNum = CNUMSUM
While (iNum > 0)
k = k + 1
i = Int(CROWMAX * Rnd()) + 1
If (iAry(i) < CNUMMAX) Then
iAry(i) = iAry(i) + 1
iNum = iNum - 1
End If
Wend
Debug.Print "k = " & k
Range("B1").Resize(CROWMAX) = _
WorksheetFunction.Transpose(iAry)
End Sub
Public Sub test3()
Const CNUMSUM As Long = 100
Const CROWMAX As Long = 30
Const CNUMMAX As Long = 4
Dim iAry(1 To CROWMAX) As Long, iPos(1 To CROWMAX) As Long
Dim i As Long, j As Long, k As Long
Dim iNum As Long, iHdn As Long
Randomize
For i = 1 To CROWMAX
iAry(i) = 0
iPos(i) = i
Next
k = 0
iNum = CNUMSUM
iHdn = 0
While (iNum > 0)
k = k + 1
j = Int((CROWMAX - iHdn) * Rnd()) + 1
i = iPos(j)
iAry(i) = iAry(i) + 1
If (iAry(i) >= CNUMMAX) Then
iPos(j) = iPos(CROWMAX - iHdn)
iHdn = iHdn + 1
End If
iNum = iNum - 1
Wend
Debug.Print "k = " & k
Range("C1").Resize(CROWMAX) = _
WorksheetFunction.Transpose(iAry)
End Sub
No.2
- 回答日時:
「30個の乱数を並べて100でなかったらやり直し」ってのが理屈は簡単そうです。
でも、おそらく時間がかかると思うので、合計100になる状態を作っておいて(例えば10個4で20個3みたいな感じ)あとは、好みの回数だけ、ランダムな所から1引いて、ランダムな所に1加えるって作業を繰り返せば、それなりの状況が出来るのではないでしょうか?(もちろん0から1引いたり4に1足したらいけませんからその手の処理は必要です。)
その他であれば、30カ所の中のランダムな所に1を加えるという作業を100回繰り返すって方が、速度的には速いかも。(もちろん4だったら1は足しません)
お試しください。
No.1
- 回答日時:
言語が違っても、同じやり方のプログラムは作れます。
別解:
「1~30の乱数 r を発生させ、 r行目を+1する。既に4なら4でない行になるまで乱数発生を繰り返す」を100回繰り返す
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルでのVBA 2 2022/08/03 06:48
- Excel(エクセル) VBAで重複データを合算したい(時間) 1 2022/12/08 23:06
- Excel(エクセル) 電卓は正しいのに エクセルで計算させると間違った答えです。なぜ? 7 2022/08/11 07:04
- 統計学 風速を1秒刻みで推定する方法 6 2023/03/03 11:58
- 戦争・テロ・デモ パンデミックの際にはトイレットペーパーなど買い占めるべき?それともNG? 9 2022/07/13 11:37
- 統計学 どの統計を使えばいいのか教えてください(EZ-Rを使用) 5 2022/10/11 13:28
- その他(職業・資格) 第二種衛生管理者の過去問題で4月公表、10月公表というものがありますが試験問題は流用されますか? 1 2023/05/05 20:12
- Java Javaの問題なのですが、 永久ループを使って以下に従って数値を出力するプログラムを作成する。 ・1 3 2023/06/06 18:43
- 大学受験 高2旧帝大志望です。共通テスト数学のアドバイスください泣 2 2022/12/14 19:32
- Visual Basic(VBA) エクセルで特定のセルのみを任意のタイミングで更新する方法 1 2023/06/23 21:23
このQ&Aを見た人はこんなQ&Aも見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
数字の配分
Excel(エクセル)
-
エクセルで、幾つかの数値を合計が100になるように計算させる方法
Excel(エクセル)
-
足して100になるような乱数のアルゴリズム
C言語・C++・C#
-
-
4
エクセルで、100%を振り分けたい
その他(Microsoft Office)
-
5
条件付きで、ランダムな数値を作成したい
Excel(エクセル)
-
6
エクセル指定した範囲からランダムで一つ抽出
Excel(エクセル)
-
7
EXCELで乱数表示に条件を加えたいのですが...
Excel(エクセル)
-
8
エクセルで自動の割り振りがしたいです。助けて下さい。
Excel(エクセル)
-
9
エクセルでエラーが出て困っています。
Excel(エクセル)
-
10
入力した合計数値を振り分けたい
Excel(エクセル)
-
11
Excelで構成比の各要素の合計を100%にしたい
Excel(エクセル)
-
12
Excelで合計値を基にデータを均等に分ける
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 exitの使い方
-
Excel-vba 文字列と変数を...
-
フォームを開くときに、コンボ...
-
数字の位ごとの値を表示するプ...
-
VBAで配列のNULL判定
-
VB6.0-整数と余りを求める
-
足して100になるような乱数のア...
-
VBAでC列が入力済みならそのま...
-
1つ前の値を変数に保存する方法
-
Nullってどういう意味ですか?
-
c++ 二体問題のソースコードを...
-
VBAのチェックボックス結果を集...
-
VBAの定数の使い方で、計算値を...
-
C言語でCLAMP(a,b,c)
-
C#の問題で2つの整数a,bの...
-
C言語 乱数を階級分け
-
VBAで72時間タイマーがオーバー...
-
世界のナベアツ
-
ラジオボタンの値の取得につい...
-
c言語で乱数を扱うときの
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 exitの使い方
-
フォームを開くときに、コンボ...
-
Excel-vba 文字列と変数を...
-
数字の位ごとの値を表示するプ...
-
VB6.0-整数と余りを求める
-
VBAで配列のNULL判定
-
足して100になるような乱数のア...
-
フリーランタイマーの時間差分...
-
DataGridView 複数行同時変更...
-
相関係数p値の出し方
-
世界のナベアツ
-
10進数をアスキーコードに変換
-
C#で動的にコントロールを取得...
-
ラジオボタンの値の取得につい...
-
DWORDって
-
バッチファイルで正規表現を使...
-
4択問題のプログラムでランダム...
-
1つ前の値を変数に保存する方法
-
VBAの定数の使い方で、計算値を...
-
コンボボックスの名前を変数に...
おすすめ情報