検索しても情報が見つからなかったので教えてください。


Excelには、-1~+1までの間でランダムに数値を返す、RND関数がありますが、

RND + RND が返す値は-2~+2までの間でランダムな数となるのでしょうか?


また、RND × RND が返す値はどのような分布になるのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (4件)

数学的にはどうなるか。

0~1の一様乱数になっているx, yであって、しかもxとyが互いに独立(一方は、他方が幾らであるか、ということとは無関係である)とします。

 「0~1の一様乱数」ってのは、その確率密度関数をφ1(t)とすると、
  φ1(t) = (0≦t<1のとき1, さもなくば 0)
となっているということ。つまり、ヒストグラムを描けば「0≦t<1のとき一定値1であり、それ以外のtについては0である」ということです。(Fig 1赤)

 x + y の確率密度関数をφa(t)とすると
  φa(t) = (0≦t<1のときt, 1≦t<2のとき1-t, さもなくば 0)
になります。ヒストグラムを描けば二等辺三角形になっている。(Fig1青)

 x × y の確率密度関数をφm(t)とすると
  φm(t) = -ln(t)
となります。ここにln( )は自然対数です。(Fig1緑)

 それぞれの分布関数
  Φ(x) = ∫{t=0~x} φ(t) dt
を計算すると、
  Φ1(x) = (x<0のとき0, 0≦x<1のときx, 1≦xのとき1)  (Fig 2赤)
  Φa(x) = (x<0のとき0, 0≦x<1のとき(x^2)/2, 0≦x<1のとき(2-(x-2)^2)/2, 2≦xのとき1)  (Fig 2青)
  Φm(x) = (x<0のとき0, 0≦x<1のとき(1-ln(x))x, 1≦xのとき1)  (Fig 2緑)
「ランダム関数の足し算とかけ算」の回答画像4
    • good
    • 0

http://www.relief.jp/itnote/archives/001183.php

ここらへんが参考になるのかもしれないです。
    • good
    • 0

> Excelには、-1~+1までの間でランダムに数値を返す、RND関数がありますが、


手元のExcel 2007で試してみましたが、そんな関数は無かったです。
0以上1未満の乱数を返す、RAND関数なら有りましたが。
(Excel VBAにならRND関数がありますが、こちらも返す値は0以上1未満で、-1~+1ではありません。)


> RND + RND が返す値は-2~+2までの間でランダムな数となるのでしょうか?
仮にそういうRND関数があったとして、範囲は-2~+2になります。
ただし、確率密度関数は一様分布になりません。
(0付近が出現しやすく、-2や+2付近は出現しにくい。)

> RND × RND
こっちの範囲は0~+1になるでしょうね。2乗するのだから負の数は出現しないので。
確率密度関数はやっぱり一様分布にはなりません。
    • good
    • 0

まず、RND関数(ワークシート関数だとRAND関数)の返す値は、-1~+1ではなく、0~1未満(1は含まない)です。

Rnd関数はVBAで使用する場合ですね。返す値は同じです。

なので、RAND+RANDが返す値は0~2未満の範囲になります。
RAND関数は、擬似乱数を返す関数なので値の分布は一様分布です。要は0.1が出る確率と0.9が出る確率とは理論的には同じということです。

また、RAND×RANDが返す値の範囲は0~1未満の範囲になりますが、ご想像されてる通り分布は一様分布ではなくなります。下記リンク先にヒストグラムが有りますので見てください。

一様乱数の積は一様乱数にはならない
http://kashino.exblog.jp/12885005/
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q値を返り値に返すのと参照渡しした引数に格納することの違い

プログラミングをしていて、次のような2種類の形式の関数をみることがあります。

void sum(int a, int b, int& c); //aとbの和をcに格納する
int sum(int a, int b); //aとbの和を返す

上の例のint &cは参照渡しされる引数という意味で、CやC++、PHPなどで同様です。

この、計算結果を参照渡しした引数に格納するのと、返り値に返すことの違いがよく分かりません。計算結果が複数ある場合は、前者の方が便利でしょう。しかし計算結果が1つだけなのに前者の方法を採っている関数も多く見かけます。個人的には、計算結果を返り値として返す後者の方法の方が感覚的に自然だと思うのですが、なぜ前者のような関数が存在するのか、教えていただきたく存じます。

Aベストアンサー

・複数の値を返したい

・↑の応用) 値とエラー等の情報を返したい
if ( MySqrt(a,b) ) { printf( "ERROR" ); } // a>0ならb=√a,戻り値0, a<=0ならbは無効で戻り値1

・戻り値として返すとパフォーマンスが悪い(C/C++の構造体等)
あるいは、関数内で変数に代入→戻ってきて呼出し側の変数に代入、というわずかな処理でも速くしたい。

・↑と関係して、同様の関数と引数の形を揃えた
構造体用が MyFunc1(a,b) / 数値用が b = MyFunc2(a) と見た目が変わらないように。

・戻り値の型を厳密に指定したい
double c = sum(a,b) ;等と暗黙の型変換をしないようにしたい。

・戻り値を返すサブルーチンが書けなかった言語からのなごり

以上、思いついたものを書いてみました。

Q一番大きな値を返す

はじめまして。ExcelVBAで「一番大きな値を持つ変数名を返す」として質問致します。
タイトルは「…値を返す」としましたが、実は「…値を持つ変数名を返す」なのです。以下に要点を記します。

例えば…
Sub mySub()
Dim my1,my2,my3,myMax '全てInteger型です。
my1=1
my2=2
my3=3
myMax=Application.WorksheetFunction.Max(my1,my2,my3)
MsgBox=myMax
End Sub

上の記述ですと、MsgBox に渡される値は my3 に格納されている 3 となりますが、Max値である 3 の値が格納されている変数名my3 を
MsgBox に表示させるためには、どのような考え方があるでしょうか?

If や Select Case などでコツコツと条件分岐をさせて導き出すしか方法はありませんか?
コードが短くなるように何らかの関数を用いる手法があれば嬉しいのですが…ご教示の程、よろしくお願い致します。

はじめまして。ExcelVBAで「一番大きな値を持つ変数名を返す」として質問致します。
タイトルは「…値を返す」としましたが、実は「…値を持つ変数名を返す」なのです。以下に要点を記します。

例えば…
Sub mySub()
Dim my1,my2,my3,myMax '全てInteger型です。
my1=1
my2=2
my3=3
myMax=Application.WorksheetFunction.Max(my1,my2,my3)
MsgBox=myMax
End Sub

上の記述ですと、MsgBox に渡される値は my3 に格納されている 3 となりますが、Max値である 3 の値が格納されている変...続きを読む

Aベストアンサー

ユーザにとって「変数名」は意味を持たないはずなので、コードで変数名を取得するようなことは、しないと思いますが…
同種のデータを大量に扱う場合、通常は、配列に入れておいて、変数名の
代わりにインデックス番号を扱うと思います。

>If や Select Case などでコツコツと条件分岐をさせて導き出すしか方法はありませんか?
前出の配列という概念が、ご質問の回答ではないかと思いますが。
例えばaという配列に数値が入っていて、その最大値とインデックスを取るなら
 For i = LBound(a) To UBound(a)
  If a(i) > aMax Then aMax = a(i): aIndex = i
 Next i
 MsgBox (aIndex & " , " & aMax)
みたいな感じ。

どうしても、同質の変数名ではなく、個別の名称にしたければ(実態は変わってしまいますが)、連想配列で変数名(もどき)を代入しておくという方法もあるけど、その名前は計算上まったく必要ないはずなので、わざわざやることもないですね。

質問の意味を取り違えていましたら、無視してください。

ユーザにとって「変数名」は意味を持たないはずなので、コードで変数名を取得するようなことは、しないと思いますが…
同種のデータを大量に扱う場合、通常は、配列に入れておいて、変数名の
代わりにインデックス番号を扱うと思います。

>If や Select Case などでコツコツと条件分岐をさせて導き出すしか方法はありませんか?
前出の配列という概念が、ご質問の回答ではないかと思いますが。
例えばaという配列に数値が入っていて、その最大値とインデックスを取るなら
 For i = LBound(a) To UBound(a...続きを読む

QExcelVBAで戻り値を返すには

ExcelVBAで、Oracleからデータを取得してブックを閉じるVBAを作成しています。
行いたい事は、このVBAが正常終了したか異常終了したかを判定したいのですが、ブックからの戻り値の返し方がわかりません。

ExcelVBA側
-------
Function Auto_Open()
Application.Visible = False
Application.ScreenUpdating = False

ret = RunExec() 'Oracleからデータ取得
If (ret <> True) Then
Auto_Open = False
Else
Auto_Open = True
End If

ActiveWorkbook.Saved = True
Application.DisplayAlerts = False
ThisWorkbook.Application.Quit

End Function
-------

このVBAをコマンドプロンプトから起動しても、正常時も失敗時も%ERRORLEVEL%が0になります。

ブックを閉じるときに戻り値を返す事はできないのでしょうか。

ExcelVBAで、Oracleからデータを取得してブックを閉じるVBAを作成しています。
行いたい事は、このVBAが正常終了したか異常終了したかを判定したいのですが、ブックからの戻り値の返し方がわかりません。

ExcelVBA側
-------
Function Auto_Open()
Application.Visible = False
Application.ScreenUpdating = False

ret = RunExec() 'Oracleからデータ取得
If (ret <> True) Then
Auto_Open = False
Else
Auto_Open = True
End If

ActiveWorkbook.Saved = True
Ap...続きを読む

Aベストアンサー

私も興味が有って、探してみました。
環境変数を取得することはできるようですが、設定は出来ないようです。

http://homepage1.nifty.com/rucio/main/technique/Function.htm

で、この様なテクニックを見つけました。
参考までに。
http://www.kit.co.jp/vbit/QAndA02.htm#VBのアプリケーションの戻り値

Q1~10まで足すプログラム

H8のマイコンを使い始めた初心者です。
1~10まで足すプログラムを作りたいのですが、自分なりに以下のように組んでみました。合っているか分からないので、詳しい方いたら教えていただきです。
(アドレスは適当です。)

FFF100 > MOV.L #200100,ER1
FFF106 > MOV.B #00,R0L
FFF108 > MOV.B #0A,ROH
FFF10A > INC.B #1,R0L
FFF10C > CMP.B R0L,ROH
FFF10E > BNE FFF10A
FFF112 > MOV.B R0L,ER1

Aベストアンサー

H8と言う言語を知らないので回答は出せませんが、
このプログラムを見るとカウンタは0から9までカウントされ、10回ループされますが、肝心の1~10までの足し算がされていません。

FFF108 と FFF10A の間に足しこむ命令、および、はじめに初期化する命令が必要ですね。

QVBSの関数で複数の値を返したい

関数から2つの値を返したいと思っています。
ByRefで以下のようにすれば変数STRの内容を書き換えられると思ったのですが、エラーにはならないものの値は変わらないようです。
このような使い方はできないのでしょうか?

STR = "STR"
TEST(STR)
Msgbox STR

Sub TEST(ByRef STR)
STR = "TEST"
End Sub

Aベストアンサー

リファレンスのcallのところを参照してください。
call を省略した場合は、引数全体を囲む括弧も省略する必要があります。

TEST(STR) と書いたため、引数は STR という変数でなく、括弧に囲まれた (STR)という 式 と結びついたため、STR は変更されません。
まあ、実行時に「ByRefの引数に式を渡した」というエラーが出てしかるべきだとは思いますが。

ということで、
TEST STR
CALL TEST(STR)
のいずれかに修正。


人気Q&Aランキング

おすすめ情報