• ベストアンサー

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

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

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の数値になります

koji1956
質問者

お礼

遅れて申し訳ありません;回答ありがとうございます。 ちょっとよく理解ができなかったので、そのまま貼り付けて実行してみたのですが、y(1)~y(45)までを出力した結果、1~45の数値が並ばず、0~1までの少数が表示されておりました。 110行目でランダム値を決めていると思うのですがそこに45をかけて整数値のみ抽出すればいいのでしょうか? 130~200にかけてがいまいちよく分らず、数値の入れ替えを行っているということは理解できました。でもそれがどういう目的で使用されてるかなどがわかりません><;

その他の回答 (5)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.6

すみません 当方のミスでした 転記する再に 代入文を間違ってしまいました 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

koji1956
質問者

お礼

非常に遅れて申し訳ありません!ちょっと今までPCから離れている生活をしていたもので・・・; ありがとうございます!指摘箇所を変更したらちゃんとなりました! またお世話になるかもしれませんが、その時はよろしくお願いします!

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.5

170行または110行の y(n)への代入が間違ってませんか y(n)の中身は1から45の整数なんですが ・・・

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

#3です 1から45までの数値をランダムに並べ替えることをしています x(n)にはランダムなデータ y(n)には1か45までの数値 100-120で初期設定を行います 130-200で x(n)がx(m)より小さい場合は入れ替えます これで y(n)にランダムに並んだ数値になります

  • dezimac
  • ベストアンサー率56% (2365/4208)
回答No.2

課題か何かでしょうか? 大雑把な考え方は合っているのでアドバイス程度で。 > 今まで決めたデータの数字を比較して一緒か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ですから特に問題はないでしょう。

koji1956
質問者

お礼

解答ありがとうございます。 課題ではないのですが、クジを引いて順番を決めていたのでプログラム作ったほうが早いなぁと思ったので。 乱数はある一定の流れがあると聞いていたので20~90までの行数でパターンを変えていたのですが、たった2行でできるとは・・・。 130行は後々やってみたら最後の1~2個の数字が表示されなかったことに気がつきました、これが原因だったのですね、ありがとうございます。

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.1

> N88相互Basic for Windows95 は、知らないので、具体的にどう直せば良いかは提示できません・・・ 申し訳ない。 でも、コードを見る限り、150行でやっているのは、 「同じ数字があったら、振りなおす」だけですよね? 「振りなおした数字が、これまでの物と同じではない」事をチェックしなおさなければならないでは? 例えば、 1個目「1」で、2個目が「2」のとき、 3個目として「2」だったとすると、 1個目は違うのでOK 2個目で同じなので振りなおし・・・ で、この時、もし振りなおしが「1」だったとしても、 今のプログラムは1個目を再チェックしてませんからOKになってしまいますよね?

koji1956
質問者

お礼

おぉ!ありがとうございます! なるほど、そういうことだったのですね・・・ 試しに 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

関連するQ&A

  • このプログラムは何言語?何のプログラム?

    このプログラムは何言語?何のプログラム? 手掛かり的な情報は全く無いのです。 10 CLS:CGSET 1,0 20 DEF SPRITE 0,(0,1,0,0,0)= CHR$(1)+CHR$(0)+CHR$(3)+CHR$(2) 30 SPRITE ON 40 FOR X=0 TO 240 50 SPRITE 0,X,120 60 PAUSE 3 70 NEXT

  • 効率のよい方法ないでしょうか?(VB.NET 2002)

    a,b,c,d,e (100) という配列があり、それぞれ、 1~100までの数字をばらばらに入れたいのです。 ↓のプログラムを変数の分書かなくてはいけないのでしょうか? (Control変数は使えないようですし・・・) For for_i = 1 To 200 x = Int(Rnd() * 100) + 1 y = Int(Rnd() * 100) + 1 st = a(y) a(y) = a(x) a(x) = st next For for_i = 1 To 200 x = Int(Rnd() * 100) + 1 y = Int(Rnd() * 100) + 1 st = b(y) b(y) = b(x) b(x) = st next 以下省略!!

  • n88basicのプログラムを十進ベーシックに翻訳してください。

    n88basicの次のプログラムを十1進ベーシックではどうなるのか教えてください。 10 cls 20 p=1000 30 for n=1 to 1000:next n 40 p=p-1 50 if p=-1 then end 60 locate 10,10:print p 70 goto 30

  • HSPについて

    HSP初心者ですが↓のスクリプトは暗記ゲームなんですが、同じようなことを何度も繰り返しています。省略する方法はないのでしょうか。それとinput命令で最初にある0を消してから入力しなければいけませんが、最初を空白にする方法も教えてください。 randomize cls *q1 cls s=0 q+=1 a1=rnd(9)+1 mes ""+a1+"" wait 100 cls input s,100,20,q button "判定",*h1 a=a1 stop *h1 cls if a=s : wait 100 : else :mes "不正解" : wait 100 : end *q2 cls s=0 q+=1 a1=rnd(9)+1 : a2=rnd(9)+1 mes ""+a1+""+a2+"" wait 100 cls input s,100,20,q a=a1*10+a2 button "判定",*h2 stop *h2 cls if a=s : wait 100 : else :mes "不正解" : wait 100 : end *q3 cls s=0 q+=1 a1=rnd(9)+1 : a2=rnd(9)+1 : a3=rnd(9)+1 mes ""+a1+""+a2+""+a3+"" wait 100 cls input s,100,20,q a=a1*100+a2*10+a3 button "判定",*h3 stop *h3 cls if a=s : wait 100 : else :mes "不正解" : wait 100 : end *q4 ・ ・ ・

  • このマクロの繰り返し?

    もう、なにがなんやらで・・・ このマクロの繰り返しを入れ子で出来ないでしょうか? 加算しながら増やしていくので、わけわからなくなりそうです。 Option Explicit Sub hiat() Cells.Clear Dim s As Long, a As Long, b As Long, c As Long, d As Long, e As Long For a = 1 To 31 s = Rnd * 4 Cells(a, 1) = s If s >= 4 Then Exit For '4がでたら終わり。 Next For b = 2 To 31 s = Rnd * 4 Cells(a, b) = s If s >= 4 Then Exit For '4がでたら終わり。 Next Cells(a + 1, b).Select 'セルの移動 Cells(a + 1, b).Activate For c = 1 To 31 - a s = Rnd * 4 ActiveCell(c) = s If s >= 4 Then Exit For '4がでたら終わり。 Next Cells(a + c, b + 1).Select 'セルの移動 Cells(a + c, b + 1).Activate For d = 1 To 31 - a - c s = Rnd * 4 ActiveCell(d) = s If s >= 4 Then Exit For '4がでたら終わり。 Next Cells(a + c + d - 1, b + 2).Select 'セルの移動 Cells(a + c + d - 1, b + 2).Activate For e = 1 To 31 - a - b - c - d s = Rnd * 4 ActiveCell(e) = s If s >= 4 Then Exit For '4がでたら終わり。 Next Cells(a + c + e - 1, b - 1 + d + 1).Select 'セルの移動 Cells(a + c + e - 1, b - 1 + d + 1).Activate End Sub

  • basic プログラムです。

    100 DIM A(5) 110 FOR J=1 TO 5 120 READ A(J)   130 NEXT J   140 FOR I=1 TO 4  150 LET K=1    160 FOR J=I+1 TO 5  170 IF A(J)<A(K) THEN LET k=J  180 NEXT J    190 LET T=A(I)    200 LET A(I)=A(K)   210 LET A(K)=T    220 FOR J=1 TO 5   230 PRINT A(J);   240 NEXT J     250 PRINT      260 NEXT I     270 DATA 5,3,7,2,1,  280 END を実行すると 13725 31725 31275 71235 という数字が出てきます。 どうしてこのような結果が出るのか 解説をお願いします。

  • N88 basicプログラムの質問(ノルム計算)1

    N88 basicプログラムにおいて鉱物のノルム計算ができるようにしたいのですが、プログラムを打ち込んだのですが、うまく動きません。どなたかわかる方がいればご教授頂きたく願います。 かなり長くなりますが、ぜひともお願い致します。 下記、打ち込んだプログラムとなります。 長いので、質問を分けて入力します。 10 ' 20 '***** normative calculation program for clay minerals ***** by T,Igarashi,1983 30 ' 40 OPTION BASE 1 50 CONSOLE 0,25,0,1 60 WIDTH 40,25 70 ' 80 ' 90 DIM A$(22),DMY$(22),AA$(22),B1$(31),M$(8),L$(8) 100 DIM A(8,22),A1(22),A2(22),B(31),B0(8,31),C9(31),TOTAL(2,8) 110 GOSUB *INIT.1 120 ON ERROR GOTO 5000 130 GOSUB *ENTER 140 FOR QQ=1 TO NN 150 GOSUB *INIT.2 160 IF KORF=1 THEN GOSUB *FILE ELSE GOSUB *KEYBOARD 170 GOSUB *STORE 180 GOSUB *CALC 190 GOSUB *OUTPUT 200 NEXT QQ 210 GOSUB *PRINTOUT 220 GOTO 130 230 ' 240 ' 250 ' 260 *INIT.1 270 RESTORE 290 280 FOR I=1 TO 22 : READ AA$(I) : READ A2(I) : NEXT 290 DATA SIO2,60.085,TiO2,79.899,Al2O3,101.961,Fe2O3,159.692,FeO,71.846,MnO,70.937,MgO,40.304,CaO,56.079,Na2O,61.979,K2O,94.195 300 DATA P2O5,141.943,Cl,35.453,SO3,80.57,S,32.6,Cr2O3,151.989,ZrO2,123.218,F,18.99,CO2,44.9,H2O+,18,H2O-,1,Ig.LOSS,1,Others,1 310 RESTORE 330 320 FOR I=1 TO 31 : READ B1$(I) : NEXT 330 DATA Q,C,ad,mi,ab,an,ka,se,ch,gi,mo,pp,dp,al,Z,hl,th,cc,mg,sd,li,mt,he,cm,pr,il,ru,ap,fr,en,ot 340 C9(1)=A2(1) : C9(2)=A2(3) : C9(3)=A2(1)+A2(3) : C9(4)=A2(10)+A2(3)+A2(1)*6 : C9(5)=A2(9)+A2(3)+A2(1)*6 : C9(6)=A2(8)+A2(3)+A2(1)*2 : C9(7)=A2(3)+A2(1)*2+A2(19)*2 350 C9(8)=A2(10)+A2(3)*3+A2(1)*6+A2(19)*2 : C9(9)=A2(7)*5+A2(3)+A2(1)*3+A2(19)*4 : C9(10)=A2(3)+A2(19)*3 : C9(11)=A2(9)*33+A2(3)+A2(7)+A2(1)*4+A2(19)*4 : C9(12)=A2(3)+A2(1)*4+A2(19) 360 C9(13)=A2(3)+A2(19) : C9(14)=A2(10)+A2(3)*3+A2(13)*4+A2(19)*6 : C9(15)=A2(1)+A2(16) : C9(16)=(A2(9)-16)/2+A2(12) : C9(17)=A2(9)+A2(13) : C9(18)=A2(8)+A2(18) : C9(19)=A2(7)+A2(18) : C9(20)=A2(5)+A2(18) 370 C9(21)=A2(4)+A2(19) : C9(22)=A2(4)+A2(5) : C9(23)=A2(4) : C9(24)=A2(5)+A2(15) : C9(25)=A2(5)-16+A2(14)*2 : C9(26)=A2(2)+A2(5) : C9(27)=A2(2) : C9(28)=A2(8)*10+A2(11)*3+A2(19) 380 C9(29)=A2(8)-A2(17)*2 : C9(30)=A2(1)+A2(7) : C9(31)=1 : DD=0 390 FOR I=1 TO 31 : B(I)=0 : NEXT 400 RETURN 410 ' 420 ' 430 ' 440 *ENTER 450 C=0 : KORF=0 : SCREEN 3,3 : CLS 3 : SCREEN 3,0 : LINE(0,0)-(639,199),6,BF : COLOR 2 460 LOCATE 0,5 : PRINT "How many samples (Max 8 samples)";: INPUT NN 470 IF NN>8 THEN CLS 1 : GOTO 460 480 IF NN=0 THEN GOTO *PROEND 490 COLOR 2 : LOCATE 0,8 : PRINT "Input data from Keyboard or File or End : K/F/E" 500 Y$=INKEY$ 510 IF Y$="" THEN 490 520 IF Y$="e" OR Y$="E" THEN GOTO *PROEND 530 IF Y$="k" OR Y$="K" THEN KORF=0 : RETURN 540 IF Y$<>"f" AND Y$<>"F" THEN 490 550 KORF=1 560 RETURN 570 ' 580 ' 590 ' 600 *INIT.2 610 CLS 1 620 FOR I=1 TO 22 : A(QQ,I)=0 : NEXT I 630 FOR I=1 TO 31 : B(I)=0 : B0(QQ,I)=0 : NEXT I 640 RETURN 650 ' 660 ' 670 ' 680 *FILE 690 OPEN "data.1" AS #1 700 FIELD #1,40 AS MINERAL$,40 AS L1$ 710 FOR I=1 TO 22 : FIELD #1,(I-1)*4+80 AS DMY$(I),4 AS A$(I) : NEXT 720 MAX=LOF(1) : IF MAX=0 THEN RETURN 440 730 LOCATE 1,2 : PRINT MAX;"records are filing." 740 IF DD=1 THEN 800 750 LOCATE 2,5 : PRINT "You need list (Y/N)?": Y$=INKEY$ 760 IF Y$"" THEN 750 770 IF Y$="N" OR Y$="n" OR Y$="ミ" THEN 800 780 IF Y$="Y" OR Y$="y" OR Y$="ン" THEN GOSUB *NAME.LIST : GOTO 800 790 GOTO 750 800 LOCATE 2,10 : INPUT "Record No.";N 810 IF N>MAX THEN CLS 1 : GOTO 730 820 GET #1,N 830 M$=MINERAL$ : L$=L1$ 840 FOR I=1 TO 11 : A(QQ,I)=CVS(A$(I)) : A(QQ,I+11)=CVS(A$(I+11)) : NEXT 850 CLOSE #1 : DD=1 860 LOCATE 2,15 : PRINT "Correct data : Y/N"; : Y$=INKEY$ 870 IF Y$="" THEN 860 880 IF Y$="Y" OR Y$="y" THEN C=1 : GOTO 1120 890 IF Y$="N" OR Y$="n" THEN RETURN 180 900 GOTO 860 910 ' 920 ' 930 ' 940 *NAME.LIST 950 LPRINT 960 LPRINT CHR$(27) ; "V0960" ;CHR$(&H8) 970 LPRINT "Sample Name" ; TAB(40); "Locality" 980 LPRINT CHR$(27);"V0960";CHR$(&H8) 990 FOR II=1 TO MAX 1000 GET #1, II 1010 M$=MINERAL$ : L$=L1$ 1020 LPRINT M$; TAB(40); L$ 1030 NEXT 1040 LPRINT CHR$(27) ; "V0960";CHR$(&H8) 1050 LPRINT CHR$(12) 1060 RETURN 1070 ' 1080 ' 1090 ' 1100 *KEYBOARD 1110 M$="" : L$="" : FOR I=1 TO 22 : A(QQ,I)=0 : NEXT I

  • VBAでランダムな並び替えをするには

    エクセルのシート1行目に1~40の数字を連番で記入し、3行目に左のセルから順番にランダムに並べるマクロを以下のように書きましたが、動きません。どこが違っているのでしょうか、ご指導いただけますか。 1  2  3   4  5 ・・・・40 ↓  ↓  ↓  ↓  ↓ 21 35 33 14 20 ・・・・ 以下マクロ '1から40までの数を一列に並べる。 for i=1 to 40 cells(1,i)=i:cells(3,i)="" next i for i=1 To 40 msgbox(40-i+1&"枚から1枚選びます") '1から40までの数をランダムに1つ発生させる。    x=int(rnd()*40)) +1 cells(3,1)=cells(1,x) for j=x+1 to 40 cells(1,j-1)=cells(1,j) next j cells(1-j,x)="" msgbox("確認して下さい") cells(3,1)=cells(6,4) cells(6,4)="" x=int(rnd()*39) +1    cells(3,2)=cells(1,x)     next i  

  • vbaでfor nextの計算

    vbaでfor nextを使って計算しています。 excelのシートの値を使って計算しています。 for nextが3重になっていて中のyとxのfor next が計算し終わったらjのfor nextで次のセルを参照したいのですがうまくいきません。 どうしたらいいか教えてください。 コードは以下の通りです For j = 1 To 2 Step 1 For y = 3 To 90 Step 3 γ = y / 180 * π For x = -180 To 180 Step 6 α = x / 180 * π γs = Range("A:A").Rows(j).Value / 180 * π αs = Range("B:B").Rows(j).Value / 180 * π Eeg = Range("C:C").Rows(j).Value Eed = Range("D:D").Rows(j).Value 計算式(省略) Next x Next y Next j

  • C#についてです

    乱数を発生させて、折れ線グラフを作りたいのですが、分かりません。 乱数を15個、100までの範囲で発生させたかったので、下のように書いては見ました。      Random rnd = new Random(); for (int i = 0; i < 15; i++) { rnd.Next(100); } この乱数を、配列にして、グラフを作りたいと思っています。 配列にするにはどうすれば、よいのでしょうか? お願いいたします。