なるほど……非常に勉強になります。
皆様、わたしの戯言におつきあいいただき、感謝しております。(*´ω`*)
皆様から教えていただいたことを元に、ためしにモジュールを作ってみますた。
つたない作りですが、動かした感じでは一応乱数を作れてるみたいだし、
速度もこんなもんかなあ、と。
#module
#defcfunc hugernd str a
max = a : keta = strlen(max) : res = ""
; 同じ桁数の乱数を作る
repeat keta
res += str(rnd(10))
loop
dim h1, keta : dim h2, keta
repeat keta
h1(cnt) = int(strmid(max,cnt,1))
h2(cnt) = int(strmid(res,cnt,1))
loop
while
; 最上位の桁を比較、生成数の方が指定数未満なら確定、それ以外は引き算
if h1(0) <= h2(0) {
dim kk, keta
repeat keta
h2(cnt) -= h1(cnt)
loop
for i, keta-1, 0, -1
if h2(i) < 0 {
h2(i) += 10
h2(i-1) -= 1
}
next
} else {
_break
}
wend
res = ""
repeat keta
res += str(h2(cnt))
loop
return res
#global
randomize
pos 0,0 : button "乱数発生", *makernd
stop
*makernd
color 255,255,255:boxf
color 0,0,0
pos 20, 40
mes "5 未満"
mes hugernd("5")
mes "50 未満"
mes hugernd("50")
mes "500 未満"
mes hugernd("500")
mes "50000 未満"
mes hugernd("50000")
mes "5000000 未満"
mes hugernd("5000000")
mes "500000000000000 未満"
mes hugernd("500000000000000")
mes "50000000000000000000000000000000000000000000000000000000000000 未満"
mes hugernd("50000000000000000000000000000000000000000000000000000000000000")
stop
しかし、ちゃんとした乱数なのか、とゆわれると、どうなんですかねエヘヘという。
いちおう、目的の乱数(っぽいもの)は出せるようになりましたので解決にしておきます。
引き続き、「きったねえソースだなあ」「もっとこう書けるだろ」みたいなご叱責が
ありましたらバンバンお願いいたします。(*´Д`*)