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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
1116
くりる大きい乱数8解決


くりる

リンク

2018/11/16(Fri) 18:59:54|NO.85833

乱数を作りたいのですが、rnd命令だと32768までしか作れません。
100000までの乱数の出し方を考えても思い浮かびません。
ただ乱数を3つ足すだけでは正確ではないので0〜99999まで均等に分かれるやり方を教えてください。



この記事に返信する


ham

リンク

2018/11/16(Fri) 20:31:02|NO.85834

hspdaのrndf_getiという命令なら99999も可能ですよ。
rndとはアルゴリズムが違うらしく、精度も増すようです。



ham

リンク

2018/11/16(Fri) 21:12:43|NO.85835

こちらのrand48でも可能でした。
http://hsp.tv/play/pforum.php?mode=pastwch&num=76666#76697

インクルードするだけで何も変えずに使えるようになってるのでこっちの方が楽ではありますね。



Velgail

リンク

2018/11/16(Fri) 21:50:28|NO.85836

2年前のソースコードを発掘したので展示
http://hsp.tv/play/pforum.php?mode=pastwch&num=72960#75302

なんというか、適当モジュール感があって名前空間ぶっ壊してくる(initとか絶対つけちゃいけない命名規則)
…… 修正依頼するなら今のうち。



くりる

リンク

2018/11/17(Sat) 14:12:28|NO.85837

ありがとうございます。
なんとなく標準命令だけで作りたいんですよね〜。
その後ずっと考えていたらrnd(40)*32768+rnd(32768)で0~1310719までいけるんじゃね?となり、それを使いました。
でも精度が上がるのならそっちもありかな?と思います。
ご回答ありがとうございました。



aaa

リンク

2018/11/17(Sat) 17:50:06|NO.85839

既に解決済みとのことですが、なたで様のページに標準命令のみを使った乱数生成の記事があります。
ページをそのまま張り付けてよかったのかわからなかったため検索用のワードだけ。
"指定した範囲の乱数を作成したい(実戦編)"
これで出てくるのでとても参考になるかと思います



沢渡

リンク

2018/11/27(Tue) 20:24:29|NO.85891

こんな感じだとどうでしょうか?
まず0〜2147483647の乱数を求め、それを任意の範囲(たとえば100000)で割るという方法で
無理矢理やってみましたが。

#define ctype rnd_ex(%1) (rnd(32768)*65536+rnd(2)*32768+rnd(32768))\(%1) //実行例 randomize repeat 25 mes rnd_ex(100000) loop



沢渡

リンク

2018/11/27(Tue) 20:29:08|NO.85892

おまけ:「xorshiftとかいう方法使ったら行けるんじゃ?」と思って作ってみたやつ。
後になって別にxorshiftじゃなくても問題ないことに気付いたが、せっかくなので投稿。
(参考)
https://blog.visvirial.com/articles/575
https://ja.wikipedia.org/wiki/Xorshift
http://www.jstatsoft.org/v08/i14/paper

#module #deffunc randomize_xor int seed flag=1 x=123456789 y=362436069 z=521288629 w=seed return #defcfunc rnd_xor int r_max if flag=0 : randomize_xor 0 t=x^(x<<11) x=y : y=z : z=w w=(w^(w>>19))^(t^(t>>8)) return (w&0x7FFFFFFF)\r_max #global //以下、例 randomize_xor 654187 repeat 25 mes rnd_xor(100000) loop



沢渡

リンク

2018/11/27(Tue) 20:54:28|NO.85893

あ、追記です。
85891の一行目は、以下に置き換えてください。(全体をカッコでくくるの忘れてた)

#define ctype rnd_ex(%1) ((rnd(32768)*65536+rnd(2)*32768+rnd(32768))\(%1))



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