HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
1116
aoiランダムにでる数字の出現率を変える6未解決


aoi

リンク

2008/11/16(Sun) 22:23:06|NO.20832

randomizeを使って、例えば0〜9の数字を1つずつランダムに提示するとき、
各数字の出現率は大体11%くらいになりますが、ひとつの数字だけ
(例えば0だけ)出現率を20%くらいにするなど、出現する頻度を変える
ことはできるのでしょうか。

ご存知の方がいましたら、教えてください。



この記事に返信する


check

リンク

2008/11/16(Sun) 22:28:36|NO.20834

最初にrnd(20)くらいでランダムに数字を取得して、
その数が1から10だったら0に設定、11だったら1みたいにする。



じった

リンク

2008/11/16(Sun) 23:54:22|NO.20835

あくまで一例ですが、こんな方法があります。

randomize dim a,20 ;要素の数はとりあえず20にしたが、 ;もっと細かく確立を指定したければ、もっと増やしても良い。 a( 0)=0,1,2,3,4,5,6,7,8,9 a(10)=2,2,2,2,3,3,3,3,4,4 ;↑確保した配列変数に、『数』を登録していく。 ;出現率を上げたい『数』を多めに登録する。 ;上の例では、『2』は20分の5、つまり25%の確率で出現 repeat 10 r=rnd(20) ;確保した配列変数の中から選び出す。 mes a(r) loop



トノ

リンク

2008/11/17(Mon) 08:39:30|NO.20842

> 例えば0〜9の数字を1つずつランダムに提示するとき、
> 各数字の出現率は大体11%くらいになりますが

計算が合わないよ



aoi

リンク

2008/11/17(Mon) 08:58:18|NO.20844

>計算が合わないよ

10%くらいになるのが正しいと思うのですが、
時々出現率が11〜12%ぐらいになることがあったので・・・

今までは、下のように記述していました。


randomize xx=0 repeat mondaisuu x=rnd(20) R.xx =str(x) xx=xx+1 loop



flory

リンク

2008/11/17(Mon) 18:21:26|NO.20857

>10%くらいになるのが正しいと思うのですが、
>時々出現率が11~12%ぐらいになることがあったので・・・

まったく意味のないことですが、rnd関数で0から9までの数をランダムに得て、各数字の出現確率を計算するサンプルを以下に示します。

; サンプルその1。 ; rnd関数で0~9の数をランダムに得て、 ; その出現確率を計算する。 #const num 100 ; この100という数値が計測回数を表す。 ; 変更するときは1以上の整数にすること。 ; 負数を指定すると無限ループになり、 ; 0を指定すると0除算のエラー、 ; 小数値を指定するとおかしな結果になる(当然)。 randomize dim count, 10 ; カウント保持用配列変数 repeat num ; 計測回数分繰り返す count(rnd(10)) ++ ; カウントアップ loop mes "計測回数 : " + num + "回" repeat 10 mes "" + cnt + "の出現確率 : " + strf("%g %%",double(count(cnt))*100/num) loop

計測回数が少ないうちは理想の値(10%)から大きくはずれることもありますが、計測回数が1000、10000を超えるぐらいからだんだん10%に近づいていきます。


次に、じったさんの方法で各数字の出現確率を変え、その出現確率を計算してみます。

; サンプルその2。 ; 事前に要素を設定しておいてから、 ; rnd関数で要素をランダムに選び出し、 ; 出現確率を計算する。 #const num 100 ; この100という数値が計測回数を表す。 ; 変更するときは1以上の整数にすること。 ; 負数を指定すると無限ループになり、 ; 0を指定すると0除算のエラー、 ; 小数値を指定するとおかしな結果になる(当然)。 randomize dim count, 10 ; カウント保持用配列変数 dim element, 20 ; 要素格納用配列変数 element = 0,0,0,0,0,1,1,1,1,2,2,2,3,3,4,5,6,7,8,9 repeat num ; 計測回数分繰り返す count(element(rnd(20))) ++ ; カウントアップ loop mes "計測回数 : " + num + "回" repeat 10 mes "" + cnt + "の出現確率 : " + strf("%g %%",double(count(cnt))*100/num) loop

きちんと出現確率が変化しているのがわかります。
また、このときも、計測回数が十分に多いときは、理想の値に近い数値が出るのがわかります。



natu

リンク

2008/11/17(Mon) 23:20:08|NO.20871

穴がありそうですがこんな感じになります.アルゴリズム自体はNO.20834のcheckさんのものと同じです.
皆さんがヒント出してるのに...

#define P 12.3 ; % (0から100) #define KORE 0 ; Pの確率でこれが出る #define RANDMAX 10 ; L([0 - (RANDMAX-1)] | KORE) の整数乱数を発生 randomize x = double(P) * 10 ; (p / 100) * 1000 ... 1000 は下 rnd(1000) と対応(小さすぎず 大きすぎない) dim c ; count value dim value ; return value if(KORE == 0 && RANDMAX == 1) { dialog "error" end(1) } repeat 100000 if(x <= rnd(1000)) { repeat value = rnd(RANDMAX) if(value != KORE) { break } loop } else { value = KORE } if(value == KORE) { c++ } loop mes "理論値 : " + P + "%" mes "測定値 : " + double(c)/100000*100 + "%"



ONION software Copyright 1997-2021(c) All rights reserved.