[[20140920072401]] 『-9から9までの間で乱数』(ゴンタ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『-9から9までの間で乱数』(ゴンタ)

 お世話になります
 100〜200までの乱数は

 Sub 乱数100から200()
  Randomize
    Dim ransuu
     ransuu = Int(Rnd * 101) + 100 
 End Sub

 で取得できますが
 マイナス9 〜 プラス9までの乱数取得方法をお教え下さい
 宜しくお願いします

< 使用 Excel:Excel2003、使用 OS:WindowsXP >


 こんな感じですか?
    Sub ランダム()
        Dim a(1 To 100)
        Dim i As Long
        Randomize
        For i = 1 To 100
            a(i) = Int(Rnd * 19) - 9
        Next i
        Range("A1").Resize(100).Value = Application.Transpose(a)
    End Sub
(稲葉) 2014/09/20(土) 08:02

 稲葉さん
 返信有難う御座います

 Int(Rnd * 19) - 9
           ~~  ~~~
 で、どうして プラス9〜マイナス9 になるのか
 私には意味不明ですが、よ〜く考えて見ます

 助かりました。有難う御座います」
(ゴンタ) 2014/09/20(土) 16:51

関数で試してみると
=RANDBETWEEN(0,18)-9
でできるようですね
(wisemac21) 2014/09/20(土) 18:10

 2003 で RANDBETWEEN はアドインで分析ツールの登録が必要ですね。
(Mook) 2014/09/20(土) 18:15

 Rnd関数の値の範囲は、

 0 <= Rnd < 1   であることが基本ですよ!! 
 不等式は、3辺への同じ正の数の加減乗除では、不等式は変わらない ので、

 3辺に19を掛けると、

 0 <= Rnd * 19 < 19

 0 <= int(Rnd*19) <19   これで int(Rnd*19)は、0〜18の整数を取得します。

 更に 3辺から 9を引く

 -9 <= int(Rnd*19) - 9 < 10  これで int(Rnd*19) - 9 は、-9 〜 10未満の整数(9以下の整数)

 ですね!!

 尚、RandBetweenの場合、 RandBetWeen(-9,9)  でOKです。

( ichinose) 2014/09/22(月) 07:09


初めまして
4.158のプラスマイナス2の乱数を、作成して一つ上で発生させた乱数との差を-0.5〜-1.0若しくは0.5〜1.0と、したい場合の
表現方法を
教えて下さい。
(マクロ初心者) 2016/08/03(水) 18:57

 ヘルプで「Rnd」を見ると、こんな風になっていますね。

 >任意の範囲の整数の乱数を生成するには、次の式を使ってください。
 >Int((upperbound - lowerbound + 1) * Rnd + lowerbound)

 と言うことは、途中まで整数(4158±2000)で処理して、出来上がりを1000で割ればいいかも。

  <10個の場合>

  行  __A__  ___B___
   1  4.296   差     
   2  3.655   0.641 
   3  2.788   0.867 
   4   2.21   0.578 
   5  2.831  -0.621 
   6  3.681   -0.85 
   7    4.5  -0.819 
   8  5.472  -0.972 
   9  4.495   0.977 
  10  5.086  -0.591 

 Sub LimitedRand()
     Dim rndNum(1 To 10, 1 To 1) '10個作成

     Dim Ubnd As Long
     Dim Lbnd As Long

     Dim LimitAry
     Dim gaugeAry

     Dim preRnd As Long
     Dim NN As Long
     Dim found As Boolean

     Randomize

     preRnd = 4158
     Ubnd = preRnd + 2000
     Lbnd = preRnd - 2000
     gaugeAry = Array(False, True, False, True, False) '妥当性判定用

     preRnd = Int((Ubnd - Lbnd + 1) * Rnd + Lbnd) '1個目の整数乱数を作成

     rndNum(1, 1) = preRnd / 1000 '1個目格納
     found = False

     For NN = 2 To UBound(rndNum)
         LimitAry = Array(0, preRnd - 1000, preRnd - 499.5, preRnd + 500, preRnd + 1000.5)
         Do Until found
             preRnd = Int((Ubnd - Lbnd + 1) * Rnd + Lbnd)
             found = Application.Lookup(preRnd, LimitAry, gaugeAry)
         Loop

         rndNum(NN, 1) = preRnd / 1000
         found = False

     Next NN

     Range("A1:A10").Value = rndNum 'シートに転記
 End Sub

(半平太) 2016/08/03(水) 21:07


ありがとうございます!
本来の最終目標は、一回につき23回乱数を出してそれを1セットととして28回繰り返します。
各セットにつき最大値を出して一つ前と比較して〜というものでしたが上記コードで得たい結果が出せました。
あとは、アレンジしていきたいと思います。

初心者なので、教えて下さい。
rndnum(1 to 10,1 to 1) の、意味を教えて下さい。
1 to 10 は、10個なのは、理解できました。
となりの 1 to 1 が、分かりません。
あと、上記の4.158以外に -47665.645 と -8153.498 という数値で同じように作成するのですが同じようにすれば作成出来ますか?
試しに、4.158を-47665.645に変更して見ましたが無理でした。
(マクロ初心者) 2016/08/03(水) 23:11


 >rndnum(1 to 10,1 to 1) の、意味を教えて下さい。 
 >となりの 1 to 1 が、分かりません。

 横が1次なので無意味に近いですが、それでも形上、2次元配列にしておけば、
 エクセルのシートと親和性が高くなり、縦方向に書出す時、何の工夫も要らなくなる為です。

 >あと、上記の4.158以外に -47665.645 と -8153.498 という数値で同じように作成するのですが同じようにすれば作成出来ますか? 
 >試しに、4.158を-47665.645に変更して見ましたが無理でした。

 -47665.645 ですかぁ!
 当初のサンプルと随分趣が異なりますね。

 (1) preRnd = 4158
         ↓へ変更
     preRnd = -47665645

 (2) LimitAry = Array(0,      preRnd - 1000, preRnd - 499.5, preRnd + 500, preRnd + 1000.5)
            ↓へ変更
   LimitAry = Array(-9999999999, preRnd - 1000, preRnd - 499.5, preRnd + 500, preRnd + 1000.5)

 <結果例>
  行  _____A_____  ___B___
   1  -47,664.507  差     
   2  -47,665.333   0.826 
   3  -47,664.631  -0.702 
   4  -47,665.600   0.969 
   5  -47,665.052  -0.548 
   6  -47,665.689   0.637 
   7  -47,664.749   -0.94 
   8  -47,665.680   0.931 
   9  -47,666.197   0.517 
  10  -47,665.449  -0.748 

(半平太) 2016/08/04(木) 00:13


重ね重ね本当にありがとうございます。
縦に「23個」、横に「28個」合計644個の乱数なのですが

 preRnd = Int((Ubnd - Lbnd + 1) * Rnd + Lbnd) '1個目の整数乱数を作成
 ↑ここで、1個しか取得していないのが理由ですか?↓

  Range("A1:A10").Value = rndNum 'シートに転記
      ↑を、試しに、変更してみましたが初めの1列目で取得した乱数と同じになりました。

自分で、アレンジしようと頑張ったのですがまだまだ勉強が足らないようです。
( マクロ初心者) 2016/08/04(木) 15:19


 ちょっと、私には仕様が理解できないので、他の回答者のレスが付くのを待ってください。

(半平太) 2016/08/04(木) 17:24


縦に23個、横に28個との事ですので
A1からAB23までの範囲に-47665.645の±2の乱数を表示という事でしょうか
だとすると半平太さんご指示の変更後
先頭の Dim rndNum( 1 To 10 , 1 To 1) を Dim rndNum( 1 To 23 , 1 To 1) に変更
最後の Range("A1:A10").Value = rndNum を Range("A1:AB23").Value = rndNum に変更
して見て下さい

(2年前のスレが上がっててビックリのゴンタ) 2016/08/05(金) 00:05


ありがとうございます。
そして、新しくスレ立てずに2年前のスレに書いてしまいすいません。

また、上記を試してみたのですが
A1:A23 に、入った乱数とまったく同じ内容でB1:B23,C1:C23・・・・AB1:AB23の中に入ってしまうのです。
違う内容の乱数にしたいのですが無理なのでしょうか?

(マクロ初心者) 2016/08/05(金) 00:35


勘違いしていたかもしれません。

基準値 4.158 プラマイ2 と、言うのは変更ありません。

例えば、1日目の最大値が 5.158 だとします。
初期値との差は、1.0 です。
2日目は、前日との差はプラマイ1.0なので5.158+0.5〜5.158+1.0(上限が、6.158なので。)
もしくは、4.658−0.5〜4.158−1.5 の間になるようにします。
3日目は、その数値に、−0.5したものから−1.0,+0.5したものから+1.0の間になるように
するコードが知りたいです。

4.658〜5.658〜6.158〜5.158〜4.158〜3.158〜3.658〜4.658〜
と、いうのうなイメージです。
↑絶対値での最大値なのでこれを基準に最大値と最小値を求めていけば
解決できるかなと思ったのですが。

そして、グラフ作成時にプラマイ0点が、4.158をイメージして上行ったり下行ったりゆらゆら
した感じのグラフが良いです。
(マクロ初心者) 2016/08/05(金) 18:50


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.