H8マイコンでアセンブラ言語を使用しております。
アセンブラ言語で、ランダムに分岐するようにしたいのですが、乱数ルーチンをどのように作ればよいかわかりません。
下記は現在のメインプログラムです。ポート4の4の状態を調べ、真ならHYOJIに分岐するようにし、真でないならSTARTに戻るという風にしています。
START:MOV.B@P4DR,R0L
MOV.BR0L,@SW_D
MOV.B@SW_D,R0H
BTST#4,R0H
BEQHYOJI
JMP@START
5行目のBEQから乱数ルーチンにひとまず飛んで、そこからさらにランダムに選ばれた分岐に飛ぶというようにしたいです。
乱数ルーチンは現在時刻などから値を取得し、それからランダムな値を作ったりするのでしょうか?
どなたかご協力お願いいたします。
ちなみに、下記は自分が参考にしている本です。
H8マイコン入門 堀桂太郎著
東京電機大学出版局発行
No.2ベストアンサー
- 回答日時:
No.1さんのおっしゃることはもっともです。
所詮、コンピュータのはじき出す乱数は疑似乱数にすぎません。
要はC言語でいうところの疑似乱数rand()が欲しいってことですよね。
疑似乱数は、システム時刻やクロックなどをシード(種)として与え、
連続して疑似乱数生成関数を呼び出すことで得るのが普通です。
Cであれば、srand()でシードを設定、rand()を順次呼び出すことで
疑似乱数が得られます。
------------------------------------------------------------
私は下記のようなコードで48bitの疑似乱数を発生して使いました。
ER1:ER0と連結した48ビットです。
※H8Sのコードですので、一部書き直しが必要かもしれません
読めば分かると思うのでそのままにしておきます。
48ビットを一度に全部使うよりも最上位E1の16ビットずつ使う方が
より乱数らしくなります。当たり前かもしれませんが。
シードはゼロ以外のものを与えてください。ゼロを与えると常にゼロに
なってしまいます。
当然ですが、得られる乱数もゼロ以外になります。
ゼロが欲しい場合は下の方のbitを捨てて対応してください。
------------------------------------------------------------
なお、シードが同じであれば得られる疑似乱数列は常に同じになります。
下記コードのように決め打ちでシードを与えると、疑似乱数とは言えなく
なりますので、適当に変化する値をシードとして与えてください。
★見やすくするため全角スペースを使用しています。
コピペする場合はご注意下さい。
INIT: MOV.L #H'12345678,ER0 ; シードの設定
MOV.L #H'56789ABC,ER1 ; (固定値は非推奨)
MOV.L ER0,@SEED
MOV.L ER1,@SEED+4
LOOP: BSR RANDOM
MOV.W E1,R6 ; この時点でのER1:ER0が疑似乱数
BRA LOOP ; (E1だけを使う方がベター)
RANDOM: MOV.L @SEED,ER0
MOV.L @SEED+4,ER1
MOV.W R0,E2
MOV.W E1,R2
SHAL.L #2,ER2 ; この命令の書き方はH8Sだけかも
MOV.W E2,R1
MOV R1L,R1H
MOV R2H,R1L
XOR.W E0,R1
MOV.W R0,E0
MOV.W E1,R0
MOV.W R1,E1
MOV.L ER0,@SEED
MOV.L ER1,@SEED+4
RTS
.SECTION RAM,DATA,ALIGN=2
SEED: .RES.L 2
本題の、乱数ルーチンについてはこれで解決したと思います。コードは一部分からない点があり理解できたわけではありませんが。
擬似乱数を用いてどのように別のルーチンに分岐するか、というところでまた詰まってしまい、乱数をテストしてみるところまではいけませんでした。
しかしながらプログラムは完成に近づいていると思います。
回答ありがとうございました。
No.1
- 回答日時:
結論から言うとランダムな数字を作る方法はありません。
必ず法則性があるからです。
だったらランダムの中の特殊な一つである「順番」でも同じじゃないかという話にもなりますね。
それでも出来るだけランダム風にしたいのであればM系列の発生器でも持ってきますか。
これも決まった順番で数値が出てくるだけですが、それらを幾つか組み合わせて途中でリセットしたりすればランダム風味になります。
しかし実は決まったとおりにしか動いてはいないのですが。
この回答への補足
回答ありがとうございます。
完璧なランダムは作らなくてよいです。
ある程度ばらつきがある数値の順番が何周も回るような程度でもよいのですが……
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHP MySql ページング 2 2022/09/20 06:38
- 日本語 〈場所を示す「に」と「で」〉 という誤り 36 2022/11/12 15:04
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- Java Javaの問題なのですが、 永久ループを使って以下に従って数値を出力するプログラムを作成する。 ・1 3 2023/06/06 18:43
- 数学 既存の数列のランダム性について(初歩的質問) 2 2022/06/07 20:04
- その他(コンピューター・テクノロジー) 量子コンピュータの動作原理がわかりません。同じビットが、1でも0でも有って良いだろうか? 3 2023/02/04 03:20
- C言語・C++・C# c言語の質問です。 ランダムに4桁の暗証番号を出力するプログラムを作ったのですが、4947→4973 3 2022/04/16 16:47
- 日本語 「~人」と「~名」の使い分け 2 2022/06/02 11:59
- 統計学 風速を1秒刻みで推定する方法 6 2023/03/03 11:58
- パチンコ・スロット パチンコ当たり抽選 3 2022/04/20 23:26
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
水圧で圧死すると、体が破裂す...
-
バヨネット式熱交換器ってなん...
-
レコードの仕組み
-
幽霊が出る部屋に塩を置くと黒...
-
屋根一体型太陽光パネルについて
-
こんにちは、参考文献について...
-
半導体素子やCPUはどのように設...
-
量子ゆらぎにより真空中に人間...
-
ウイルスが観察できる顕微鏡は...
-
西暦2100年は、どうしてうるう...
-
潜水艇「タイタン」
-
永久磁石って永久なのですか? ...
-
物質について
-
水がH2Oである理由
-
金って、実はどこでも取れるの...
-
自然に物が集まる現象に共通し...
-
エベレストの頂上で水を沸騰さ...
-
これって本物ですか?
-
測定した大気圧と温度をもとに...
-
オシロスコープ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報