- 締切済み
重複しない整数をランダム表示
エクセル98を使用しています。 例えば3つのセルに1~5の数字をランダムに、重複させないように表示させることはできるでしょうか? 作業用のスペースを使用して、いくつか処理を加えれば可能なのですが、関数を組み合わせてもっとスマートにできる方法はないかと思い、ダメ元で質問させて頂きました。 大したことではないのですが、いいアイディアがある方はアドバイスを頂けると助かります。
- みんなの回答 (9)
- 専門家の回答
みんなの回答
- 0shiete
- ベストアンサー率30% (148/492)
#6です。 #7様に指摘されたとおりです。 INTは切捨てでした。 #6の回答を B1:=INT(RAND()*(B2-2))+2 に訂正します。 #7様、有難うございましたm(__)m
- taisuke555
- ベストアンサー率55% (132/236)
#5、#7の補足です。 4つ目の重複しないランダムな数字 D1セル =MOD(MOD(MOD(INT(RAND()*17)+(LARGE(A1:C1,1)-LARGE(A1:C1,2)),18)+(LARGE(A1:C1,2)-LARGE(A1:C1,3)),19)+MIN(A1:C1),20)+1 5つ目の重複しないランダムな数字 E1セル =MOD(MOD(MOD(MOD(INT(RAND()*16)+(LARGE(A1:D1,1)-LARGE(A1:D1,2)),17)+(LARGE(A1:D1,2)-LARGE(A1:D1,3)),18)+(LARGE(A1:D1,3)-LARGE(A1:D1,4)),19)+MIN(A1:D1),20)+1 のようにMOD、LARGE関数を追加していく事で対応できますが、 関数の文字列は最大何文字までか忘れましたが、限度があると思いますので、いくつでも出来る関数ではありませんね。 同じ数式の繰り返しなのでスマートに出来そうなのですが、ひらめきませんでした。
- taisuke555
- ベストアンサー率55% (132/236)
#5で回答した者です。 0shieteさん疑問です。 B1:=INT(RAND()*(B2-3))+2では例えばB2=20だった場合、 Int(Rand()*17)+2で2~18までの数字のランダムになると思うのですが、 B1:=INT(RAND()*(B2-2))+2ではありませんか? (間違っていたらすみません) ------------------------- #5の考え方です。(といっても説明しにくいので1つずつの関数を見ていくだけですが) 関数の下の()内の数字はランダムで取得できる数字の範囲です。 (1)A1セル =INT(RAND()*20)+1 (1~20) (2)B1セル(A1=12と仮定すると) =INT(RAND()*19) (0~18) =INT(RAND()*19)+A1 (12~30) =MOD(INT(RAND()*19)+A1,20) (0~10、12~19) =MOD(INT(RAND()*19)+A1,20)+1 (1~11、13~20) で12を除いた1~20の数 (3)C1セル(B1=7だったと仮定すると ABS(A1-B1)=A1-B1の絶対値=5、 MIN(A1,B1)=A1とB1の小さい方=7) =INT(RAND()*18) (0~17) =INT(RAND()*18)+(ABS(A1-B1)) (5~22) =MOD(INT(RAND()*18)+(ABS(A1-B1)),19) (0~3、5~18) =MOD(INT(RAND()*18)+(ABS(A1-B1)),19)+MIN(A1,B1) (7~10、12~25) =MOD(MOD(INT(RAND()*18)+(ABS(A1-B1)),19)+MIN(A1,B1),20) (0~5、7~10、12~19) =MOD(MOD(INT(RAND()*18)+(ABS(A1-B1)),19)+MIN(A1,B1),20)+1 (1~6、8~11、13~20) で7、12を除いた1~20の数 A1セルとB1セルは仮定で数字を入れましたが他の数字でも問題ないと思います。 試してみてください。
- 0shiete
- ベストアンサー率30% (148/492)
3つのセルの場合について、考えました。 B2にはランダムに表示させたい最大数が入っているものとします。 (1~Nの数字を表示させたいならNをB2に) A1:=INT(RAND()*(B1-1))+1 B1:=INT(RAND()*(B2-3))+2 C1:=IF(B1=(B2-1),B2,INT((B2-B1)*RAND())+B1+1) が今回考えた式です。 考え方は、 まず、B1で一つ数字を決め A1のセルには1~B1の値でサイコロを振り、 C1のセルにはB1の値~B2の値でサイコロを振る という考え方です。 ですから、必ず、A1<B1<C1の関係がでてきます。 また、B2の値が小さすぎるとき、(B2=4の時) は、出てこない組み合わせがあります。
- taisuke555
- ベストアンサー率55% (132/236)
私も考えてみました。 20までの重複しない数字を拾います。 (1) A1: =INT(RAND()*20)+1 B1: =MOD(INT(RAND()*19)+A1,20)+1 C1: =MOD(MOD(INT(RAND()*18)+(ABS(A1-B1)),19)+MIN(A1,B1),20)+1 でどうでしょうか? (一応テスト中には重複した数字は出てきませんでしたが、確認してみてください) (2)ユーザー定義関数(VBAがわかる方でしたら) 標準モジュールに ---------この下から----------- Function RandA(Rn As Range, SI As Integer, EI As Integer) Dim Cl As Range '検索セル Dim Er As Boolean '重複フラグ Dim Nm As Integer 'ランダム数 If (Rn.Count > EI - SI) Then 'ランダム数字の個数よりセル数が多い場合 RandA = "Error" '戻り値にエラーを設定 Exit Function End If 'ランダム数設定 Do Nm = Int(Rnd() * (EI - SI + 1)) + SI 'SI ~ EI までのランダム数設定 Er = False '重複フラグを解除 For Each Cl In Rn If (Cl.Value = Nm) Then '重複数字がある場合 Er = True '重複フラグを設定 Exit For End If Next Cl Loop While (Er = True) '重複フラグが解除されるまでDo...Loopを繰り返す RandA = Nm '戻り値にランダム数を設定 End Function ---------この上まで----------- を貼り付けて A1セル =INT(RAND()*20)+1 A2セル =randa(A1,1,20) A3セル =randa(A1:B1,1,20) ※=randa(範囲,開始数字,終了数字) 開始数字から、終了数字までの間で、範囲にない数字をランダムで表示 という方法もあります。(VBAの方はあくまでサンプルです) 間違っていたり、わからない事があれば、補足してください。
- 0shiete
- ベストアンサー率30% (148/492)
補足の書き込み有難うございます。 2桁の場合についてもお考えになっている とのことですので、 参考になるかどうかわかりませんが、 以前、私が回答したものを挙げさせていただきます。 「ロト6の数字をどうやって決めるか」という質問です。
- 0shiete
- ベストアンサー率30% (148/492)
#2様の回答を読んで思いついたので、回答させていただきます。 #2様のrand()の部分をrandbetween()を使っては いかがでしょうか? A1 =MID("12345",RANDBETWEEN(1,5),1) B1 =MID(SUBSTITUTE("12345",A1,),RANDBETWEEN(1,4),1) C1 =MID(SUBSTITUTE(SUBSTITUTE("12345",A1,),B1,),RANDBETWEEN(1,3),1) RAND()がゼロを返す場合がなくなります。
- comv
- ベストアンサー率52% (322/612)
こんばんは こんな感じで如何でしょうか A1 =MID("12345",ROUNDUP(RAND()*5,0),1) B1 =MID(SUBSTITUTE("12345",A1,),ROUNDUP(RAND()*4,0),1) C1 =MID(SUBSTITUTE(SUBSTITUTE("12345",A1,),B1,),ROUNDUP(RAND()*3,0),1) RAND()の結果が0の場合のみ支障がありますが 発生確率上無視してよいと思います。
補足
御回答ありがとうございます。 数式を見て、「なるほど~」って思ってしまいました(^^; すでに選ばれた数字を抜き取って、その中からまたランダムに選択して行くって方法ですね。 RAND()で0が発生しないように、下記のようにアレンジを加えてみました。 A1 =MID("12345",INT(RAND()*5)+1,1) B1 =MID(SUBSTITUTE("12345",A1,),INT(RAND()*4)+1,1) C1 =MID(SUBSTITUTE(SUBSTITUTE("12345",A1,),B1,),INT(RAND()*3)+1,1) 大したアレンジでもないですけどね(^^; 今の所は、選択する数字が少ないので良いのですが、これが1~10の中から、となった場合は、この方法は使用できないですよね。 1桁の内は何とか大丈夫そうですが、選択する数字は今後どんどん増えて行くので、2桁になった場合も考えてみようと思います。 2桁の場合のいいアイディアがありましたら、アドバイスして頂けると助かります。
- taknt
- ベストアンサー率19% (1556/7783)
VBAでやるのかな? 普通は、並び替えで実現します。 1から5まで 配列に それぞれの 数字(1から5まで順に入れます) それで ランダムで 1から 5までの数字を二つ出します。 例 a(1)からa(5)まで 1から 5入れてるとします。 ランダムで 2と 3が出たとします。 a(2)の値と a(3)の値を交換します。 これを 何回か繰り返すと ランダムな a(1)からa(5)までが できます。 って わかるかな?
補足
御回答ありがとうございます。 VBAでも良いのですが、よくVBAが分からないので関数でやってみたいと思っています。 VBAの方が簡単であれば、そっちを使用したいと思いますが。 ん~、せっかく回答して頂いたのですが私の頭では理解できませんでした(ー_ー; 要するにランダムで2つの数字を発生させて、あらかじめ入力していた数字の中で、ランダムで出て来た数字どうしを入れ替えるということでしょうか? でもこの方法だと、かなり手順を踏まないといけないような気がするのですが、私の理解方法が悪いのかな。 できれば、一発で1~5の数字の中から3つをランダムで表示できるようにしたいと思っています。 いいアイディアがピンときましたら、またアドバイスを御願い致します。 私の方も試行錯誤してみます。
補足
御回答ありがとうございます。 randbetween()関数ですが、エクセル98なので実装されていないんです(T_T) この関数があれば、ちょっと楽になるんですけどね~。 1~10の中から選択するなど、2桁も含めた場合の方法も現在試行錯誤中です。 何か良いアドバイスがありましたら、よろしく御願いします。