• ベストアンサー

Rnd関数って

VBのRnd関数を使って次のようにフォーム上に値を返させたときに疑問が沸いたのですが。 sub イベント() Dim Data As Single Randomize Data = Rnd() Text1.Text = Data Text2.Text = Int(Data * 100) end sub この何回かイベントを実行すると例えば text1  text2 0.367   36 0.782   78 8.591   8 の様に値が返されてきます。 ここで2つ不思議なのが HELPでRnd関数を調べると、0以上1未満の範囲の値を返します。となっているのに、なぜ8.591の様な値が出てくるのか? さらに8.591を100かけて小数点以下切り捨てると859になるはずが、なぜ8になるのか? 理由がわかる方教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.3

8.591E-02という指数形式の表示になっているのではないでしょうか。 本当の数値は0.08591でちゃんと0~1に入っているはずです。

souta_n
質問者

お礼

もっとテキストボックスを広げて・・・ほっほんとだ そういうことだったのか!指数表示だ!しょうもね~ すんごくはずかし~・・・たったこんだけのことだったのか!ありがとうございました。

その他の回答 (3)

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.4

タイマーコントロールを張って、下のコードをやってみるがヨロシ Private Sub cmdMondai_Click()   Dim Data As Double   Dim strWk  As String      Randomize   Data = Rnd()   Text1.Text = Data   Text2.Text = Round(Data * 100)   Call hogehoge End Sub Private Sub hogehoge()   Dim strWk  As String   Dim strCalc As String   Dim intWk  As Integer   Dim intピリオド As Integer      If Left(Text1, 1) <> "0" Then     intWk = InStr(1, Text1, "E-")     intピリオド = Mid(Text1, intWk + 2)     strCalc = Replace(Left(Text1, intWk - 1), ".", "")     strCalc = "0." & String(intピリオド - 1, "0") & strCalc          strWk = "Text1の値が[" & Text1.Text & "]だから、期待値にならない" & vbCrLf & vbCrLf     strWk = strWk & "[" & Text1.Text & "] という値は、指数を使わずに計算すると、[" & strCalc & "]" & vbCrLf & vbCrLf     strWk = strWk & "指数のついた計算には気を配る必要がある"     MsgBox strWk     Timer1.Enabled = False   End If End Sub Private Sub Form_Load()   Timer1.Interval = 10   Timer1.Enabled = True    End Sub Private Sub Timer1_Timer()   Call cmdMondai_Click End Sub

souta_n
質問者

お礼

ありがとうございました。理由がわかりました。 ところでSubプロシージャ名のhogehogeが妙にはまってしまって笑いが止まりません。どうしよう 今度自分で作る時にこの名前使ってしまいそうです。

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.2

text1の横幅を広げて見ましょう。 隠れていた何かが表示されます。

souta_n
質問者

補足

広げてみました・・・う~ん分からない・・・ ひょっとして私って「とろい」

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.1

Dataの方をダブルに汁 100倍値を少数第1位で、四捨五入汁 すると、0~1に収まる

souta_n
質問者

補足

さっそくの解答ありがとうございます。 Private Sub cmdMondai_Click() Dim Data As Double Randomize Data = Rnd() Text1.Text = Data Text2.Text = Round(Data * 100) End Sub とするということでしょうか? やってみましたけど以前との変化はありません。 Rnd関数の戻り値は単精度浮動小数点型なのですが、なぜDoubleにするのですか? 0~1に収めたいのではなく、HELPでは0~1となっているのに1以上の戻り値があるのはなぜか、という疑問なんです。

関連するQ&A

  • 乱数について(Rnd関数)

    すみません。質問があります。 VBAを用いてパチスロシミュレータを作成しているのですが 乱数が偏っている気がしてなりません。 乱数はRnd関数を用いて0~65535の範囲で生成しています。 もちろん初期化時にRandomizeも用いています。 毎ゲーム開始時にそのゲームで必要な乱数を4つ r1 = Int(Rnd() * 65536) r2 = Int(Rnd() * 65536) r3 = Int(Rnd() * 65536) r4 = Int(Rnd() * 65536) というように生成しています。 それらの乱数を用いて複雑なモード移行などを行っているのですが、 ある条件下でr1のあるビットが1になりやすいというような現象が起こります。 乱数に法則性があることは不思議ではないんですが、Rnd関数による乱数っていうのは多少複雑な処理をしただけでこのような不具合が出る可能性があるのでしょうか。 私のプログラムに問題があるとは思うのですが、「もしかして、乱数のせいかも?」という疑念を抱いてデバッグするのはつらいものがあるので。 ですので、 ・変な使い方をすれば目に見えて偏る可能性もある。 という意見の方はその「変な使い方」というのを具体的に教えていただけないでしょうか? また、そのような意見の方がしばらくいらっしゃらない場合はRnd関数による乱数は実用上問題なく使えると解釈したいと思います。 よろしくおねがいします。

  • rnd関数の使い方教えてください。

    初歩的かも知れませんが、よろしお願いします。 仕様環境:Access2007 Win7 ・・・・・ 只今、新規レコードに自動的にランダムな数字が割り振られるように テストしています。 調べたところ「rnd関数」というものを使うということが解りました。 試験用のデータベースを簡単に作り テーブルの項目(フィールド)も簡単にしました。 テストテーブル ------------------- ID(オートナンバー) 名前(テキスト型) 住所(テキスト型) 乱数(テキスト型)または(数値型)←あとで説明しますが。。 ------------------- 乱数のフィールドにある「規定値」にrnd関数を入力しテーブルを保存しようとすると、 「テーブルレベル入力規則の未定義の関数名です。。」と エラーが出てしまいます。テキスト型でも数値型でもです。 rnd関数は、、 int((200-100+1)*rnd+100) ↓入力してエンターを押すと Int((200-100+1)*Rnd()+100)となります。 つまり100から200までの間の数字をランダムに割り振ろうと挑戦しています。 ちなみにテーブルから「乱数」フィールドを消して、フォームにテキストボックスを作り、 コントロールソースに入力しても「未定義です」のようなエラーがでます。(関数の前に”=”もつけたのですが) また規定値に入力しビューで見ると「#Name?」となります。 クエリにrnd関数のフィールドを作ってフォームにつなげても出来ません。 (集計で「演算」にして作ってみたりしたのですが。。) まるっきりrnd関数の使い方がわかりません(汗)。 VBA(モジュール)は使わず、フィールドプロパティなど基本的な機能かマクロでやりたいです。 また重複しないようにしたいのです。 漠然とした相談ですが、どの場面(テーブルやクエリやフォーム)でどう使うか教えてください、 新規レコードにランダムな番号(複数桁で)割り振られるようにしたいです。 宜しくお願いします。

  • 乱数の発生 Randomizeを入れた方が良いのか

    VBAについて教えてください。 --------------------------- Sub Randomizeを入れた場合() Dim intMax As Integer Dim intMin As Integer Randomize intMin = 1 intMax = 10 Debug.Print Int((intMax - intMin + 1) * Rnd + intMin) End Sub --------------------------- Sub Randomizeを入れていない場合() Dim intMax As Integer Dim intMin As Integer intMin = 1 intMax = 10 Debug.Print Int((intMax - intMin + 1) * Rnd + intMin) End Sub --------------------------- 上記二つのマクロを実行しても 同じような結果が得られる気がするのですがRandomizeは必要なのでしょうか? 一つのサブプロシージャーの中で1回しか乱数を発生させないのなら Randomizeを使って乱数を初期化する必要はないのですか?

  • Randomizeがある時とない時の違いがわからな

    vbaです Sub Sample1() Randomize Debug.Print Int((6 - 1 + 1) * Rnd + 1) End Sub Sub Sample2() Debug.Print Int((6 - 1 + 1) * Rnd + 1) End Sub の違いがわからないのですが、 Randomizeはどのような役割をなしてるのでしょうか? Sample1の結果は、 5 3 3 4 3 1 6 5 3 4 で、 Sample2の結果は、 4 5 4 3 4 1 4 1 6 1 5 5 でした。

  • VB.NETとして書き換え

    コマンドボタンを押すたびに ココ という文字をテキストボックスに書く。 Private Sub Command1_Click() Dim i As Integer i = Int(Rnd * 4) For c = 0 To 4 Text1(c).Text = "" Next c Text1(i).Text = "ココ" End Sub VB6ではこんなふうになると思います。 .NETではどう書けばいいのでしょうか?

  • Excel Vbaの関数Intの機能について

    Excel Vbaでの関数Intの機能について教えてください ある特定の値についての処理が私の予想に反した動きをします。私の理解が浅いと思うのですがその理由が分かりません。 Vbaでプロシジャーを作ってみました。ともに小数0.3を10倍し、 その値とIntの値を比較しています。コードの違いは(1)と(2)です。 Public Sub Test1() Dim dblNum1 As Double, dblNum2 As Double dblNum1 = 0.2 dblNum1 = dblNum1 + 0.1 ……(1) dblNum2 = dblNum1 * 10 Debug.Print "Int(dblNum2) = " & Int(dblNum2); " : dblNum2 = " & dblNum2 Debug.Print "差(Test1):" & dblNum2 - Int(dblNum2) End Sub Public Sub Test2() Dim dblNum1 As Double, dblNum2 As Double dblNum1 = 0.3 ' dblNum1 = dblNum1 + 0.1 ……(2)コメントにしています dblNum2 = dblNum1 * 10 Debug.Print "Int(dblNum2) = " & Int(dblNum2); " : dblNum2 = " & dblNum2 Debug.Print "差(Test2):" & dblNum2 - Int(dblNum2) End Sub 実行結果は次のようになりました。 Test1の結果 Int(dblNum2) = 3 : dblNum2 = 3 差(Test1):4.44089209850063E-16 Test2の結果 Int(dblNum2) = 3 : dblNum2 = 3 差(Test2):0 差(Test1)がなぜ0にならないのか不思議な気がします(当たり前なのかな?)。 0.8についても同様な結果になります。 その他の値0.1 ~ 0.9では、私の予想通り、差(Test1)、差(Test2)ともに0になります。 ネットなどで検索したら、浮動小数点の扱いに関係がありそうだなのかなぐらいは想像できるのですが具体的な仕組みはよく分かりません。 この疑問に至った背景について、説明します。 Int関数の機能については特段興味はなかったのですが、「有限小数の小数点以下の桁数を調べる関数」を作るのに利用していました。その関数では、なぜか特定の小数についてはうまく機能しませんでした。調べていくうちに上記のような現象に気づきました。 話がそれて厚かましいお願いになりますが、「有限小数の小数点以下の桁数を調べる関数」のコーディングの例を教えていただけないでしょうか。私が作った関数は以下のようになります。これについてもアドバイスをいただければ大変助かります。   Public Function FiniteDCPlace(dblR As Double, intMax As Integer) As Integer '機能:小数点以下の何桁の有限小数になるか、その桁数を調べる。 '引数:dblRは小数、intMax は調べる最大の桁数 ただしintMaxは7以下の値 '戻り値:小数点以下の桁数がintMax以下の有限小数の場合、その桁数 ' それ以外は「-1」 Dim i As Integer Dim dblNum As Double If intMax > 7 Then FiniteDCPlace = -1 Exit Function Else 'No Ope End If dblNum = dblR FiniteDCPlace = -1 For i = 0 To intMax Debug.Print "Int(dblNum) = " & Int(dblNum) & " : dblNum = " & dblNum Debug.Print "差(FiniteDCPlace):" & dblNum - Int(dblNum) If Int(dblNum) = dblNum Then FiniteDCPlace = i Exit For Else dblNum = dblNum * 10 FiniteDCPlace = -1 End If Next End Function 次のプロシジャーでチェックしました。 小数 0.028 のとき3ではなく、-1を返します。 Private Sub testFiniteDCPlace() Dim intNum As Integer Dim dblNum As Double Dim i As Integer dblNum = 0.028 ‘予想外の結果になる intNum = FiniteDCPlace(dblNum, 7) Debug.Print dblNum & " の桁数 : " & intNum dblNum = 0.027 ‘予想通りの結果になる 3になる intNum = FiniteDCPlace(dblNum, 7) Debug.Print dblNum & " の桁数 : " & intNum End Sub ちなみに、環境はOS Widows10 、Excel2013 です。 以上よろしくお願いします。 質問の内容を書いてください

  • 重複しない乱数発生

    初めて投稿させて頂きます。 サイコロを振って、一度出た目はもう出ないような ゲームをプログラミングしています。 Dim i As Integer Dim j As Integer Dim t As Integer Dim r(6) As Integer 'コンピュータ Dim b As Integer 'プレイヤー Private Sub Command1_Click() b = Val(Text2.Text) Randomize r(6) = Int(Rnd * 6 + 1) '1~6までの乱数発生 Text1.Text = r(6) For i = 1 To n r(i) = i 'r(i)~r(n)に1~nの値を格納 Next i For i = n To 2 Step -1 j = Int((i - 1) * Rnd() + 1) '1~i-1の範囲の乱数 t = r(i): r(i) = r(j): r(j) = t 'r(i)とr(j)の交換 Next i For i = 1 To n Text1.Text = r(i) Next i If r(i) < j Then Label2.Caption = "あなたの勝ちです" Else Label2.Caption = "あなたの負けです" End If 幾つか考えてこれで落ち着いたのですが、これでは まだ重複してしまいます。 どこが問題なのかご指摘頂けるようお願いします。 一度出た目は出ないようにするので、全部で6回試行 することになります。またその6回分の結果を表示したいのですが、 Text3.Text = r(1) Text4.Text = r(2) Text5.Text = r(3) Text6.Text = r(4) Text7.Text = r(5) Text8.Text = r(6) としてしまうと全てに0が表示され、結果が表示されません。 これについても回答をお願いします。 まだ初心者ですが、よろしくお願いします。

  • VBAトラブル

    Sub 百人一首一番から二十番() Dim hyakuSh As Worksheet Dim mySh As Worksheet Set mySh = Worksheets("百人一首クイズ") Set hyakuSh = Worksheets("百人一首") Dim myRow As Integer Randomize myRow = Int((21 - 2 + 1) * Rnd + 2) Dim kaminoku As String Dim kaminoku2 As String Dim kaminoku3 As String Dim simonoku As String Dim simonoku1 As String Dim sakusha As String kaminoku = hyakuSh.Cells(myRow, 3).Value kaminoku2 = hyakuSh.Cells(myRow, 4).Value kaminoku3 = hyakuSh.Cells(myRow, 5).Value shimonoku = hyakuSh.Cells(myRow, 6).Value shimonoku1 = hyakuSh.Cells(myRow, 7).Value sakusha = hyakuSh.Cells(myRow, 8).Value mySh.Activate mySh.Shapes("Text Box 2").Select Selection.Characters.Text = kaminoku & Chr(10) & kaminoku2 & Chr(10) & kaminoku3 Dim MyTBox As Integer Dim smRow As Integer Dim smRow2 As Integer Dim smRow3 As Integer Dim smRow4 As Integer Dim smRow5 As Integer Dim i As Integer mySh.Shapes(2).Select Randomize smRow5 = Int((51 - 2 + 1) * Rnd + 2) Selection.Characters.Text = hyakuSh.Cells(smRow5, 6).Value & Chr(10) & hyakuSh.Cells(smRow5, 7).Value & Chr(10) & hyakuSh.Cells(smRow5, 8).Value mySh.Shapes(3).Select Randomize smRow = Int((51 - 2 + 1) * Rnd + 2) Selection.Characters.Text = hyakuSh.Cells(smRow, 6).Value & Chr(10) & hyakuSh.Cells(smRow, 7).Value & Chr(10) & hyakuSh.Cells(smRow, 8).Value mySh.Shapes(4).Select Randomize smRow2 = Int((51 - 2 + 1) * Rnd + 2) Selection.Characters.Text = hyakuSh.Cells(smRow2, 6).Value & Chr(10) & hyakuSh.Cells(smRow2, 7).Value & Chr(10) & hyakuSh.Cells(smRow2, 8).Value mySh.Shapes(5).Select Randomize smRow3 = Int((51 - 2 + 1) * Rnd + 2) Selection.Characters.Text = hyakuSh.Cells(smRow3, 6).Value & Chr(10) & hyakuSh.Cells(smRow3, 7).Value & Chr(10) & hyakuSh.Cells(smRow3, 8).Value mySh.Shapes(6).Select Randomize smRow4 = Int((51 - 2 + 1) * Rnd + 2) Selection.Characters.Text = hyakuSh.Cells(smRow4, 6).Value & Chr(10) & hyakuSh.Cells(smRow4, 7).Value & Chr(10) & hyakuSh.Cells(smRow4, 8).Value Randomize MyTBox = Int((6 - 2 + 1) * Rnd + 2) mySh.Shapes(MyTBox).Select Selection.Characters.Text = shimonoku & Chr(10) & shimonoku1 & Chr(10) & sakusha mySh.Shapes("Text Box 2").Select Dim Ans As Integer Ans = InputBox(hyakuSh.Cells(myRow, 3).Value & hyakuSh.Cells(myRow, 4).Value & hyakuSh.Cells(myRow, 5).Value & Chr(10) & Chr(10) & "下の句を番号で答えなさい", Title:="百人一首", Xpos:=7500, Ypos:=2500) If Ans = MyTBox Then MsgBox " 正解!!! V(・ o ・)V " Else MsgBox ("間違いです!!!!!!!!" & Chr(10) & Chr(10) & hyakuSh.Cells(myRow, 6).Value & hyakuSh.Cells(myRow, 7).Value & Chr(10) & Chr(10) & sakusha & "です") End If End Sub 以上のマクロをエクセルで作ったのですが、VBE~マクロを走らせると順調に走るのですが、マクロをボタンに登録すると、Inputbox に解答を掘り込んであげないと、kaminokuもshimonokuもあたらしいものになりません 今マクロはシート上にあります、マクロを標準モジュールに移しても同じ結果です。何か解決策はありますか? かなり古くエクセル2000です、初心者なので難しいこことはわかりませんが、よろしくお願いします。

  • Rnd関数について

    今Rnd関数を使って問題を作ろうとしているのですが, 40問中から重複なしに20問ランダムに出題するというものを作ろうとしています。 しかし,重複を無くすためのプログラムの仕方がわかりません。 ついこの間,VBを始めたばかり(プログラムはVBが始めて)なので, できれば詳しい解説を書いてほしいです。 今現在考えているのはこんなのです↓ Private Function RandomCnt() As Long '********************************* '* ランダムで問題の番号を取得 * '********************************* '一時的にランダムで取得した問題番号を格納 Dim RandomNo As Long RandomNo = Int((MaxRec * Rnd) + 1) 'ランダムで番号を取得 Do While volQuizNo(RandomNo) = True 'まだ出していない問題が見つかる間 RandomNo = Int((MaxRec * Rnd) + 1) 'ランダムで番号を取得 Loop volQuizNo(RandomNo) = True '出題問題のチェック RandomCnt = RandomNo End Function

  • VBA AからZで乱数を発生させたい

    Sub AからZで乱数を発生させる() Dim 最大値 As Integer Dim 最小値 As Integer Randomize 最小値 = 1 最大値 = 10 Debug.Print Int((最大値 - 最小値 + 1) * Rnd + 最小値) End Sub --------------------------------------------------------- これを実行すると、1から10の間で乱数を発生させられるのですが、 AからZの間で乱数を発生させたい場合は、 このコードをどのようにすればいいでしょうか? アドバイスよろしくお願いします。

専門家に質問してみよう