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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0731
ヤークトパンター1230次に出る数の予測みたいなのをやってみた4未解決


ヤークトパンター1230

リンク

2015/7/31(Fri) 18:04:14|NO.70382

なんとなくやってみたかったのでやってみました

*set randomize ddim result,5 rs=10000000 *dataCollection repeat rs color boxf ransu=rnd(6):ransu=ransu+1 if ransu=1:result(0)=result(0)+1 if ransu=2:result(1)=result(1)+1 if ransu=3:result(2)=result(2)+1 if ransu=4:result(3)=result(3)+1 if ransu=5:result(4)=result(4)+1 if ransu=6:result(5)=result(5)+1 color 255,255,255 a=rs b=cnt+1 per=100.0*b/a pos 0,0:mes "データ収集中 :"+per+"%" wait 1 loop *collectionresult total=result(0)+result(1)+result(2)+result(3)+result(4)+result(5) *Forecast ddim count,6 count = result(0),result(1),result(2),result(3),result(4),result(5) mm = count(0) ;初期値 foreach count if mm < count(cnt) : mm = count(cnt):bigest=cnt loop bigest=bigest+1 hper=100.0*mm/total *test ransu=rnd(6) *Display mes "演算回数 :"+rs+" mes "1 :"+result(0)+" mes "2 :"+result(1)+" mes "3 :"+result(2)+" mes "4 :"+result(3)+" mes "5 :"+result(4)+" mes "6 :"+result(5)+" mes "最大値 :"+mm+" mes "合計"+total+" mes "確率 :"+hper+" mes "予想 :"+bigest+" mes "結果 :"+ransu+" stop
しかし、これでは入力変換の予想と変わらないようだったので、ちょっとこんな風に考えてみました


仮に、1000回でデータを出す。 このうち、1000回目の数(仮に5とする)を取り出す 次に、999回のデータのうち中から、5の次に出た数をすべて取り出す。 この中の最も多かった数を予想とする
これと、上記のスプリプトのものではどちらが正確でしょうか?

間違っているかもしれませんが
ついでに私の数学の点数は57点です



この記事に返信する


Velgail

リンク

2015/7/31(Fri) 19:11:00|NO.70383

マルコフ連鎖を実装するところから始めるべきだと思いますね。

ちなみに、16.65%の正解……つまり当てずっぽうと大差なしということになる。
(乱数はわからないからこそ乱数だってはっきりわかる)

1段記憶があったらどうなるかな〜(今からやってみるだけやってみる)

ちなみに、提供されたソースは、出やすいと思われる値に全がけするので、予想とは全く関係ないです(バッサリ



Velgail

リンク

2015/7/31(Fri) 19:23:20|NO.70384

薄々気付いていたけどやっぱり推測できるわけがないw(実行結果→16.67%。要するに当てずっぽうと大差なし)

(実際には2^32周期のはずなので、全部メモリに乗せて検索してしまえばある程度の長さの乱数データから
次の乱数データを当てることは可能だけども)

中の数式にあてがあるならより類推しやすくなりますよ。多分線形合同法だけど。
まあ、線形合同法なら状態数も多くないし、簡単でしょう。(なお、やる気は(ry



スペース

リンク

2015/8/1(Sat) 03:41:47|NO.70394

さぁ、意味があるのかはわかりませんが。最終的に11.0くらいで収束しました。
当てずっぽうでも11.0に収束しましたが・・・

randomize//今までのパターンから予測(短い周期はないと思うけど・・・) 範囲=6 乱数="" 予測=-1 失敗+1:的中+1//0で除算しました対策 repeat 一時乱数=rnd(10) 乱数+=""+一時乱数+"" if cnt>=範囲:{ if 予測!-1:{ if 一時乱数=予測:{ 的中+1 title "的中率:"+strf("%3.2f",(double(的中)/double(失敗))*100.0)+"%" //Dialog "検索:"+検索列+"\n候補:"+strmid(乱数,インデックス,範囲)+"\n:周辺"+strmid(乱数,インデックス-2,範囲+4)+"\n:予測"+予測+"\n:場所"+インデックス+"":end }else:失敗+1 } 検索列=strmid(乱数,(cnt+1)-範囲,範囲)//検索元 インデックス=instr(乱数,0,検索列)//同じ配列を検索 if インデックス!-1&インデックス!((cnt+1)-範囲):予測=strmid(乱数,インデックス+範囲,1):else:予測=-1//検索元と被るのを防止する為条件を増やしています } await loop



zakki

リンク

2015/8/1(Sat) 09:18:58|NO.70396

rndとrandomizeの挙動は既知なので100%当たりました。
randomizeが未知だと2^31程度探すので運悪ければHSPでは1時間くらいかかりますが、C++で実装だと5秒くらい。

https://gist.github.com/zakki/122df02c5a183acdbdef


#include "d3m.hsp" #uselib "kernel32.dll" #cfunc GetTickCount "GetTickCount" #module x=0 #define A 214013 #define C 2531011 #deffunc mysrand int n x = n return #defcfunc myrnd int n x=x*A+C return ((x>>16)&32767) \ n #global ;randomize 9395820 randomize start = d3timer() dim sample, 15 foreach sample sample.cnt = rnd(6) loop ;repeat ; full scan repeat -1, GetTickCount() - 10000 ; depends on randomize impl n = cnt ok = 1 mysrand n foreach sample r = sample.cnt m = myrnd(6) if r ! m { ok = 0 break; } loop if ok = 1 { mes "hit " + n break } if n \ 1000000 = 0 { cls pos 0, 0 mes "" + n + " " + (100.0 / 4294967295.0 * n) + "%" wait 0 } loop mes "->" + (d3timer() - start) / 1000 + "sec" hit = 0 mis = 0 repeat 100000 predict = myrnd(6) r = rnd(6) if predict = r : hit + : else : mis + loop mes ">> " + hit + " " + mis + " " + (100 * hit) / (hit + mis) + "%"



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