- ベストアンサー
N88相互Basic for Windows95でのプログラム
初めて質問いたします。 ただいまN88相互Basic for Windows95というソフトを使用して「1~45の数字をランダムに並べて表示する」というプログラムを作成してみたのですが、どうしても数字が重複してしまうのです。どこが間違っているのか教えてください。 下記に自分の作成したプログラムを記入します。又、より効率のいい書き方があれば教えてください。よろしくお願いしますm(_ _)m 10 cls 20 input "今日は何月";tuki 30 input "何日";niti 40 for a=0 to tuki 50 for b=0 to niti 60 seki=rnd 70 next b 80 next a 90 cls 100 dim x(50) 110 x(0)=0 120 for s=1 to 45 130 x(s)=int(rnd*45) 140 for c=0 to s-1 150 if x(s)=x(c) or x(s)<1 then x(s)=int(rnd*45):goto 150 160 next c 170 if s=10+e then e=e+10:q=q+1 180 locate q*3,s-e:print x(s) 190 next s 一応流れとしましては、 「月と日を入力してランダムさを出す」 ↓ 「1~50のデータ数があるのを定義する」 ↓ 「今決めているデータの数字と今まで決めたデータの数字を比較して一緒か1未満なら決めなおす」 ↓ ↑ 「今までのと比較して、一緒じゃないなら数字を表示して次のデータへ」 という流れにしている予定ですが、どうやっても数字が重なってしまうので改善点があれば教えてください。お願いしますm(_ _)m
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
45のデータを並べ替える方法のほうが効率が良いかも 配列を2個用意して 片方はRnd関数の値そのまま代入 もう片方を1から45の数値を代入 100 for n = 1 to 45 110 x(n) = rnd : y(n) = n 120 next 130 for n=1 to 44 140 for m = n+1 to 45 150 if x(n) > x(m) then 180 160 z = x(n):x(m) = x(n):x(m) = z 170 z = y(n):y(m) = y(n):y(m) = z 180 ' 190 next 200 next といった具合で 配列yにランダムに並んだ1から45の数値になります
その他の回答 (5)
- redfox63
- ベストアンサー率71% (1325/1856)
すみません 当方のミスでした 転記する再に 代入文を間違ってしまいました m(__)m 160 z = x(n):x(n) = x(m):x(m) = z 170 z = y(n):y(n) = y(m):y(m) = z 160,170の2番目の n,mが逆でした m(__)m
お礼
非常に遅れて申し訳ありません!ちょっと今までPCから離れている生活をしていたもので・・・; ありがとうございます!指摘箇所を変更したらちゃんとなりました! またお世話になるかもしれませんが、その時はよろしくお願いします!
- redfox63
- ベストアンサー率71% (1325/1856)
170行または110行の y(n)への代入が間違ってませんか y(n)の中身は1から45の整数なんですが ・・・
- redfox63
- ベストアンサー率71% (1325/1856)
#3です 1から45までの数値をランダムに並べ替えることをしています x(n)にはランダムなデータ y(n)には1か45までの数値 100-120で初期設定を行います 130-200で x(n)がx(m)より小さい場合は入れ替えます これで y(n)にランダムに並んだ数値になります
- dezimac
- ベストアンサー率56% (2365/4208)
課題か何かでしょうか? 大雑把な考え方は合っているのでアドバイス程度で。 > 今まで決めたデータの数字を比較して一緒か1未満なら決めなおす この考え方自体は間違っていませんが、それをプログラムにした時に一つ重要な点を見逃しています。 新しく作った乱数を再び、それまで出た数値(x(0)~)と比較するのを忘れていますよ。 パソコン内部でのプログラムの動作は目に見えなくて判らないというなら、紙とペン、サイコロを用意して、実際に手を動かして試してみるとわかりやすいと思いますよ。 > より効率のいい書き方 20~90行目は「RANDOMIZE 引数」という乱数の発生パターンを変更する命令に置き換えれます。 例) 20 input "適当な数字";a 30 RANDOMIZE a 130行目 int(rnd*45)で発生するのは0~44なので、1~45欲しいなら、その結果に+1する。 +1する事で0は出来なくなるので、1未満の判定も不要になります。 PC-9800シリーズ用のN88-日本語BASIC(86)で方法ですが、 基本的にこれをWindowsで動くようにしたのがN88相互Basic for Windows95ですから特に問題はないでしょう。
お礼
解答ありがとうございます。 課題ではないのですが、クジを引いて順番を決めていたのでプログラム作ったほうが早いなぁと思ったので。 乱数はある一定の流れがあると聞いていたので20~90までの行数でパターンを変えていたのですが、たった2行でできるとは・・・。 130行は後々やってみたら最後の1~2個の数字が表示されなかったことに気がつきました、これが原因だったのですね、ありがとうございます。
- dsuekichi
- ベストアンサー率64% (171/265)
> N88相互Basic for Windows95 は、知らないので、具体的にどう直せば良いかは提示できません・・・ 申し訳ない。 でも、コードを見る限り、150行でやっているのは、 「同じ数字があったら、振りなおす」だけですよね? 「振りなおした数字が、これまでの物と同じではない」事をチェックしなおさなければならないでは? 例えば、 1個目「1」で、2個目が「2」のとき、 3個目として「2」だったとすると、 1個目は違うのでOK 2個目で同じなので振りなおし・・・ で、この時、もし振りなおしが「1」だったとしても、 今のプログラムは1個目を再チェックしてませんからOKになってしまいますよね?
お礼
おぉ!ありがとうございます! なるほど、そういうことだったのですね・・・ 試しに 150 if x(s)=x(c) or x(s)<1 then x(s)=int(rnd*45):goto 150 の部分を 150 if x(s)=x(c) or x(s)<1 then x(s)=int(rnd*45):c=0:goto 150 と変更してみたら重ならなくなりました!ありがとうございますm(_ _)m
お礼
遅れて申し訳ありません;回答ありがとうございます。 ちょっとよく理解ができなかったので、そのまま貼り付けて実行してみたのですが、y(1)~y(45)までを出力した結果、1~45の数値が並ばず、0~1までの少数が表示されておりました。 110行目でランダム値を決めていると思うのですがそこに45をかけて整数値のみ抽出すればいいのでしょうか? 130~200にかけてがいまいちよく分らず、数値の入れ替えを行っているということは理解できました。でもそれがどういう目的で使用されてるかなどがわかりません><;