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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0518
PC cat少数を含む乱数の作り方25解決


PC cat

リンク

2017/5/18(Thu) 16:26:54|NO.79844

こんにちは、今ケアレスミス対策用に、計算問題自動出題ソフトを作っています。
現在、整数でしか乱数を生成できないため、小数の問題を出すことができません。
現在の乱数生成のスクリプトです。
	picload "sozai16.jpg";画面初期化
a="";入力ボックス用 i=0;割り算用 q+1;問題番号用 xk=rnd(2);正の数か負の数かを決める yk=rnd(2) x=rnd(11.00) + 1;絶対値を作る y=rnd(11.00) + 1 h=rnd(8);加法か減法か乗法か除法か決める if xk=0: xc="+";変数を記号に変換する if xk=1: xc="ー" if yk=0: yc="+" if yk=1: yc="ー" if h=0: o="+" if h=1: o="-" if h=2: o="×" if h=3: o="÷": goto *wari: stop if h=4: o="÷": goto *wari: stop;記号をまんべんなく生成するため二重になっています if h=5: o="+" if h=6: o="-" if h=7: o="×"
です。アドバイスよろしくお願いします。



この記事に返信する


沢渡

リンク

2017/5/18(Thu) 17:44:10|NO.79847

まず整数で乱数を生成したあと、それを実数化して割れば小数の乱数ができます。
たとえば、00.00から99.99までの乱数を求めたい場合、

a=double(rnd(100000)) a=a/100
以下、実行例です。

randomize repeat 10 a=double(rnd(10000)) a=a/100 mes strf("%2.2f",a) loop



沢渡

リンク

2017/5/18(Thu) 17:45:29|NO.79848

あ、すみません、上のコードは以下に置き換えてください。

a=double(rnd(10000))/100



PC cat

リンク

2017/5/18(Thu) 17:50:06|NO.79849

ありがとうございます。早速本体に組み込みます。



PC cat

リンク

2017/5/18(Thu) 17:59:15|NO.79850

このように乱数を作成してみたんですけど
*syous
x=double(rnd(10000))/100 y=double(rnd(10000))/100
最後に必ず0000とついてしまうのですが



沢渡

リンク

2017/5/18(Thu) 18:38:11|NO.79852

実数は内部ではかなり下の方の桁まで数を保持していて、そのまま表示した場合は
小数点以下6桁まで表示するようになっています。(mes 0.0 とやってみればわかります)
ですから上のコードでは、mes strf("%2.2f",a)として、整数部分と小数部分を2桁ずつ表示するようにしています。



Y_repeat

リンク

2017/5/18(Thu) 18:39:39|NO.79853

昔書いた命令です


// 1〜0の間の実数乱数(15桁) #defcfunc dbl_rnd _f=1.0 repeat 6 // 0〜999の乱数 _r=rnd(1000) // 足す _f+=double(_r) // 十進数シフト _f*=1000 loop // 最大値を1にする return _f/1000000000000000000000.0 // p〜0の間の実数乱数 #defcfunc dbl_rnd_mul double p // 1〜0の間の実数乱数(15桁)をp倍する return dbl_rnd()*p

小数点以下削除


#defcfunc dbl_trim double p n=str(p) getstr piyo,n,0,'.' return piyo

実数の乱数は 公式dllのどっかにあったようなw



Y_repeat

リンク

2017/5/18(Thu) 18:44:59|NO.79856

hspda.dllの
rndf_get
rndf_geti
rndf_ini
の命令ですね

HDL先生に聞いてみると幸せになれるかもw



PC cat

リンク

2017/5/18(Thu) 19:19:00|NO.79858

皆さんありがとうございます。すみません、100分の1の位よりも小さい数を消すのには
どうすればいいですか?
表示するスクリプトです。
	font "MS ゴシック",28
pos 100,150 mes"問"+q+":("+xc+x+")"+o+"("+yc+y+")" pos 140,190 mes"答え" input a,100,25 button"答え合わせ", *kotae1 button"更新", *hata1 pos 400,100 mes"問題一覧" mesbox kr,200,300,1 kr+" 問"+q+": ("+xc+x+")"+o+"("+yc+y+")" stop



スペース

リンク

2017/5/18(Thu) 19:23:31|NO.79859

沢渡さんが説明してくださったstrfを使えばいいのではないでしょうか。



PC cat

リンク

2017/5/18(Thu) 20:00:06|NO.79860

ありがとうございました。おかげさまで。小数の乱数は作れました。
でも、問題が出てきてしまったため、すみませんが、もう少しお付き合い願えないでしょうか。
小数で答え合わせをすると、エラーが出てしまいます。どこがいけないでしょうか。

*kotae1 k="" if x<y: goto *yb if y<=x: goto *xb stop *hata2 if k=a: goto *tugi if k=-0:if a=0: goto *tugi stop *xb if h=7: goto *xb4 if h=6: goto *xb2 if h=5: goto *xb3 if h=4: goto *xb5 if h=3: goto *xb5 if h=2: goto *xb4 if h=0: goto *xb3 if h=1: goto *xb2 stop *xb5 if xk!yk: k="-" k=x/y goto *hata2 stop *xb4 if xk!yk: k="-" k+x*y goto *hata2 stop *xb3 if xk=1: k="-" if xk!yk: k+x-y if xk=yk: k+(x+y) goto *hata2 stop *xb2 if xk=1: k="-" if xk=yk: k+x-y if xk!yk: k+(x+y) goto *hata2 stop *tugi pos 140,300 mes"答え"+k+"" mes"正解" wait 100 kr+"="+k+"\n" goto *hata1 stop
とても長いので、yの部分は省略しました。なるべく自分でもわかる範囲で探します。



PC cat

リンク

2017/5/18(Thu) 20:06:44|NO.79861

エラーは、

#Error21 in line 85 (練習問題.hsp)
-->サポートされない機能を選択しました

と出ます



スペース

リンク

2017/5/18(Thu) 20:15:49|NO.79862

文字列形式では<や>を使用できません。
もし「if x<y」の部分でエラーが発生しているなら、
「if double(x)<double(y)」と型を変換してやれば上手く行くと思います。



スペース

リンク

2017/5/18(Thu) 20:18:00|NO.79863

書き間違いがありました。

文字列形式×
文字列型○



PC cat

リンク

2017/5/18(Thu) 20:40:22|NO.79865

ありがとうございます
計算結果の変数には何もなかったので、計算途中に問題がるんだと思われます。
スペースさんのスクリプトをx<yに埋め込んでもダメだったので、別の場所で試してみます。



PC cat

リンク

2017/5/18(Thu) 20:55:19|NO.79866

(-3.03)-(-5.91) では、
if xk=yk: k+y-x

でエラーが出ています。



掘木

リンク

2017/5/18(Thu) 21:10:51|NO.79868

>>NO.79866 PC catさん
うん?エラーの出る箇所を報告するのは良いが、自力解決の糸口を探しましょう。

デバッグウィンドウから、

xk yk k y x
それぞれの変数の型や値を確認できませんか?

エラーになりそうかどうかをまず確かめることです。
yの型がstr(文字列)になっているんじゃないかな。文字列は引き算できませんから。



PC cat

リンク

2017/5/18(Thu) 21:16:58|NO.79869

すみません。早速確認します。



PC cat

リンク

2017/5/18(Thu) 21:45:30|NO.79871

わかりました。xとyが
x=strf("%1.2f",x)
y=strf("%1.2f",y)
で変わっていることが分かったのですが、解決方法がわかりません。
教えてください。



Velgail

リンク

2017/5/18(Thu) 22:02:17|NO.79873

今実数乱数生成DLLを製作中。もう少し待って〜ww



PC cat

リンク

2017/5/18(Thu) 22:23:43|NO.79874

ありがとうございます。すみません。解決できました。

皆様、本当にありがとうございました。

x y ではなく、計算をした答えに
strf("%2.2f",a)
を使うとうまくいきました。



さか

リンク

2017/5/18(Thu) 22:24:52|NO.79875

文字列変数に変わってしまうということですね。
以下でどうでしょう。

x = double( strf("%1.2f",x) )



PC cat

リンク

2017/5/18(Thu) 22:26:37|NO.79876

ここまで付き合ってくださってありがとうございました。

無事、完成しました。



PC cat

リンク

2017/5/18(Thu) 22:28:45|NO.79877

文章行き違ってしまって申し訳ございません。早速試してみます。



PC cat

リンク

2017/5/18(Thu) 22:34:37|NO.79878

さかさんの方法でやってみた結果、エラーが発生してしまったため、申し訳ありませんが、
このままで動くのでこのままで使います。提案ありがとうございました。



掘木

リンク

2017/5/18(Thu) 22:57:25|NO.79879


p1 = 129.4 mes strf("%+1.2f",p1) // [+129.40]
strfの符号を文字列内に含める機能が、標準ランタイム下では使用可能な模様(0もプラス扱い)。
そのため、符号表示を強制するために変数として絶対値と符号に分ける必要はあまりなく、
もし分けるとするなら、符号側の変数に+1か-1を代入して、それを掛けるほうが実装上はスマートだったりする。
(式が+、−、×、÷の4択分岐程度で済むレベルには簡素化するはず。0除算とかもあるけど)

リファクタリング(コード整理)の際の参考にでもどうぞ。



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