HSPで大きな乱数を発生させる その2 実数乱数で確率を出す


2018年 11月 1日
 
 
 前回 HSPの rnd関数では 32768までの乱数しかでないので、どうやってそれ以上の乱数を出すかやりました、その続きです。
 
 
 実数(小数)での乱数発生を試してみたら、こちらの方が分かりやすく簡単だったので、それを使う事にした。
 
 

#include "hspda.as" ; 実数乱数用

	rndf_ini ; 乱数の初期化

	randomize

	pos 10,10  : mes "乱数"
	pos 100,10 : mes "最終的な乱数"

	r=10000000 ; 出したい乱数

	repeat 20
	 rndf_get f	; 0~1の乱数、0.000001ケタ
	  pos 10,cnt*20+40 : mes f

	 n=int(double(r)*f) ; 出したい乱数に%を掛ける
	  pos 100,cnt*20+40 : mes n
	loop


 
 
 #include “hspda.as” .asファイルは外部 DLLという訳では無いので HSP Dishでもたぶん問題ない。

 実数(小数点)の乱数とは 0~1の、つまり 0.000001~1.000000までの乱数で、100%が 1.0となる。

 この数に求めたい乱数の数を掛ければよい。

 つまり前回の整数乱数だと最大で 1/32768の精度だったけど、これだと最大で 1/1000000(百万)の精度になる(はずなんだけど、どういう訳かそれ以上のケタでも 1単位で乱数が出るような・・・)

 つまり 1000000以下の数であれば 1ずつの乱数を出せると言う訳だ。
 
 
 関数化(擬似命令化)してみる

#include "hspmath.as" ; 計算(round用)
#include "hspda.as" ; 実数乱数用

	rndf_ini ; 乱数の初期化

gosub *main


#defcfunc rnb int rnbn ; 大きい数の乱数

	rndf_get rnbf ; 0~1の実数乱数、0.000001ケタ
	 rnbg=int(round(double(rnbn)*rnbf)) ; 出したい乱数に%を掛ける

	return rnbg


*main

	r=2147483648-1 ; 2147483648 ; 最大数

	repeat 20
	 n=rnb(r)
	  mes n
	loop

 
 
 よし、ではランブ関数と名づけよう(適当)

 冗談はさておき、HSPで扱える数の最大が 2147483648なのだが、その数でやると値が -になるので、-1の 2147483647がこの方法で求められる最大乱数という事にたぶんなるだろう(確証は無い)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です