Tips

一定範囲内の乱数を返すメソッド

日付2009/08/21
ID75874 (英語原文参照)
バージョン11.4
プラットフォームMac & Win

4Dには乱数を生成する関数が備わっていますが、これをラッパーメソッドで強化することにより、生成される乱数に値の範囲を設けることができます。

下記のメソッドは、渡された範囲内の乱数(整数)を返すメソッドの例です。メソッドには、範囲の上限と下限を渡して下さい。同一の値が渡された場合、メソッドは0からMAXINTの範囲で乱数を返します。

`UTIL_Random ($Min_L;$Max_L) -> LONGINT

C_LONGINT($0;$Rand_L)
C_LONGINT($Min_L;$1)
C_LONGINT($Max_L;$2)
`--------------------------------------------------------------------------------
C_BOOLEAN(×RandomWarmed_b)
`--------------------------------------------------------------------------------
C_LONGINT($Ndx;$Jdx;$Kdx;$SOA;$RIS)

`====================== Initialize and Setup ================================

$Min_L:=$1
$Max_L:=$2

`// For speed purposes this is only done once
If (Not(×RandomWarmed_b))
    $RIS:=(Milliseconds%(32768-10+1))+10
    For ($Ndx;1;$RIS)
        $SOA:=Random
    End for 
End if 

`======================== Method Actions ==================================

If ($Max_L<$Min_L)
    $Ndx:=$Max_L
    $Max_L:=$Min_L
    $Min_L:=$Ndx
End if 

If ($Max_L>MAXINT )
    $Max_L:=MAXINT 
End if 

If ($Min_L=$Max_L)
    $Jdx:=0
    $Kdx:=MAXINT -1
    $Ndx:=$Kdx-$Jdx
    $Rand_L:=$Jdx+(Int(((Random/32768)*$Ndx)+1))
    $Rand_L:=$Rand_L/MAXINT 

Else 
    $Jdx:=$Min_L-1
    If ($Max_L=MAXINT )
        $Max_L:=$Max_L-1
    End if 
    $Kdx:=$Max_L
    $Ndx:=$Kdx-$Jdx
    $Rand_L:=$Jdx+(Int(((Random/32768)*$Ndx)+1))

End if 

`======================== Clean up and Exit =================================

$0:=$Rand_L