十進BASIC 第3掲示板

十進BASIC第3掲示板

十進BASICプログラミングについての質問や研究成果の公開にご利用ください。
メッセージ入力枠は右下をドラッグして拡大できます。 画像,URLは省略可能です。
編集/削除キーを入力しなくてもエラーにはなりませんが,何か適当な半角英数字4~8文字を指定してください。
特に,長文投稿の場合,プレビューで最後の行を確認しても,実際には途中で切れてしまうことがあるので,投稿後の確認が必要です。
名前
件名
メッセージ
画像
メールアドレス
URL
編集/削除キー (半角英数字のみで4~8文字)
プレビューする (投稿前に、内容をプレビューして確認できます)

マンデルブロート - しばっち

2026/07/19 (Sun) 07:50:19

ポテンシャル関数による描画


FOR I=0 TO 7
SET COLOR MIX(I) BITAND(I,2)/2,BITAND(I,4)/4,BITAND(I,1)
NEXT I
CLEAR
LET XS=-2
LET YS=-2
LET XE=2
LET YE=2
SET WINDOW XS,XE,YE,YS
SET POINT STYLE 1
ASK BITMAP SIZE XSIZE,YSIZE
LET KMAX=50
LET N=2
FOR Y=0 TO YSIZE
FOR X=0 TO XSIZE
LET A=COMPLEX(WORLDX(X),WORLDY(Y))
LET Z=0
FOR K=1 TO KMAX
LET Z=Z^N+A
IF ABS(Z)>2 THEN
LET COL=(N-LOG(LOG(ABS(Z)))/LOG(2))*8
SET POINT COLOR MAX(1,MIN(COL,255))
PLOT POINTS :WORLDX(X),WORLDY(Y)
EXIT FOR
END IF
NEXT K
NEXT X
NEXT Y
END

Re: マンデルブロート - しばっち

2026/07/19 (Sun) 07:51:54

軌道トラップによる描画


FOR I=0 TO 7
SET COLOR MIX(I) BITAND(I,2)/2,BITAND(I,4)/4,BITAND(I,1)
NEXT I
CLEAR
LET XS=-2
LET YS=-2
LET XE=2
LET YE=2
SET WINDOW XS,XE,YE,YS
SET POINT STYLE 1
ASK BITMAP SIZE XSIZE,YSIZE
LET KMAX=50
LET N=2
FOR Y=0 TO YSIZE
FOR X=0 TO XSIZE
LET A=COMPLEX(WORLDX(X),WORLDY(Y))
LET Z=0
LET MINDIST=1E+8
FOR K=1 TO KMAX
LET Z=Z^N+A
LET MINDIST=MIN(MINDIST,ABS(Z))
IF ABS(Z)>2 THEN
LET COL=INT(255*(1-MINDIST))
SET POINT COLOR MAX(0,MIN(COL,255))
PLOT POINTS :WORLDX(X),WORLDY(Y)
EXIT FOR
END IF
NEXT K
NEXT X
NEXT Y
END

Re: マンデルブロート - しばっち

2026/07/19 (Sun) 07:53:09

Zの距離を利用したもの


FOR I=0 TO 7
SET COLOR MIX(I) BITAND(I,2)/2,BITAND(I,4)/4,BITAND(I,1)
NEXT I
CLEAR
LET XS=-2
LET YS=-2
LET XE=2
LET YE=2
SET WINDOW XS,XE,YE,YS
SET POINT STYLE 1
ASK BITMAP SIZE XSIZE,YSIZE
LET KMAX=50
LET N=2
FOR Y=0 TO YSIZE
FOR X=0 TO XSIZE
LET A=COMPLEX(WORLDX(X),WORLDY(Y))
LET Z=0
LET DZ=1
FOR K=1 TO KMAX
LET Z=Z^N+A
LET DZ=N*Z^(N-1)*DZ
IF ABS(Z)>2 THEN
LET R=ABS(Z)
LET DR=ABS(DZ)
IF DR=0 THEN
LET COL=0
ELSE
LET D=R*LOG(R)/DR
LET COL=INT(D*200)
END IF
SET POINT COLOR MAX(0,MIN(COL,255))
PLOT POINTS :WORLDX(X),WORLDY(Y)
EXIT FOR
END IF
NEXT K
NEXT X
NEXT Y
END

Re: マンデルブロート - しばっち

2026/07/19 (Sun) 07:54:37

マンデルブロートの着色法には繰り返し数以外にもある。
下記プログラムはZの偏角を利用している。


SET COLOR MIX(0) 0,0,0
SET COLOR MODE "NATIVE"
CLEAR
LET XS=-2
LET YS=-2
LET XE=2
LET YE=2
SET WINDOW XS,XE,YE,YS
SET POINT STYLE 1
ASK BITMAP SIZE XSIZE,YSIZE
LET KMAX=50
LET N=2
FOR Y=0 TO YSIZE
FOR X=0 TO XSIZE
LET A=COMPLEX(WORLDX(X),WORLDY(Y))
LET Z=0
FOR K=1 TO KMAX
LET Z=Z^N+A
IF ABS(Z)>2 THEN
LET H=MOD(DEG(ANGLE(RE(Z),IM(Z)))+360,360)
CALL HSV2RGB(RR,GG,BB,H,255,255)
SET COLOR COLORINDEX(RR/255,GG/255,BB/255)
PLOT POINTS :WORLDX(X),WORLDY(Y)
EXIT FOR
END IF
NEXT K
NEXT X
NEXT Y
END

EXTERNAL SUB HSV2RGB(R,G,B,H,S,V)
IF S=0 THEN
LET R=V
LET G=V
LET B=V
EXIT SUB
END IF
LET T=V-S*V/255
LET HH=H
IF H>=300 OR H<60 THEN
IF H>=300 THEN LET HH=360-HH
IF H<60 THEN LET HH=-HH
LET HH=HH/60
LET RR=0
IF HH<0 THEN
LET BB=1
LET GG=HH+BB
ELSE
LET GG=1
LET BB=GG-HH
END IF
ELSEIF H>=60 AND H<180 THEN
LET HH=HH-120
LET HH=HH/60
LET GG=0
IF HH<0 THEN
LET BB=1
LET RR=HH+BB
ELSE
LET RR=1
LET BB=RR-HH
END IF
ELSEIF H>=180 AND H<300 THEN
LET HH=HH-240
LET HH=HH/60
LET BB=0
IF HH<0 THEN
LET RR=1
LET GG=HH+RR
ELSE
LET GG=1
LET RR=GG-HH
END IF
END IF
LET R=-RR*(V-T)+V
LET R=INT(R)
LET G=-GG*(V-T)+V
LET G=INT(G)
LET B=-BB*(V-T)+V
LET B=INT(B)
END SUB

Re: マンデルブロート - knoike

2026/07/20 (Mon) 06:21:54

本題からは離れた余談なのですが、「Mandelbrot」の t は発音せず、「マンデルブロ(マンデルブロー)」と読みます。
「ballet(バレエ)」とか、
「depot(デポ)」とか、
「buffet(ビュッフェ)」などと同じです。

4次元グラフィックス - しばっち

2026/07/05 (Sun) 07:45:02

4次元グラフィックス


https://ja.wikipedia.org/wiki/五胞体
https://ja.wikipedia.org/wiki/多胞体

ワイヤーフレームで五胞体を表示します。
平行投影で4次元→2次元としています。
また、X-Y平面を描画していますが、X-Z平面やX-W平面、Y-W平面等もあります。


OPTION ANGLE DEGREES
LET LMIN=1E+10
LET LMAX=-1E+10
DIM M(4,4),POINT(4),ROTXY(4,4),ROTXZ(4,4),ROTYW(4,4),ROTYZ(4,4),ROTXW(4,4),ROTZW(4,4)
DIM X(20),Y(20),Z(20),W(20),MESH(20,3)
FOR I=1 TO 5
READ X(I),Y(I),Z(I),W(I) ! 座標データ読み込み
LET XMAX=MAX(X(I),XMAX)
LET XMIN=MIN(X(I),XMIN)
LET YMAX=MAX(Y(I),YMAX)
LET YMIN=MIN(Y(I),YMIN)
LET ZMAX=MAX(Z(I),ZMAX)
LET ZMIN=MIN(Z(I),ZMIN)
LET WMAX=MAX(W(I),WMAX)
LET WMIN=MIN(W(I),WMIN)
NEXT I
DATA 0,0,0,1
DATA -0.559017,0.559017,0.559017,-0.25
DATA 0.559017,-0.559017,0.559017,-0.25
DATA 0.559017,0.559017,-0.559017,-0.25
DATA -0.559017,-0.559017,-0.559017,-0.25

DO
READ IF MISSING THEN EXIT DO:N
LET NUM=NUM+1
FOR I=1 TO N
READ MESH(NUM,I) ! メッシュ読み込み
NEXT I
LOOP
DATA 3,2,3,4
DATA 3,1,3,4
DATA 3,1,2,4
DATA 3,1,2,3
DATA 3,0,3,4
DATA 3,0,2,4
DATA 3,0,2,3
DATA 3,0,1,4
DATA 3,0,1,3
DATA 3,0,1,2
LET RANGE=MAX(XMAX-XMIN,MAX(YMAX-YMIN,MAX(ZMAX-ZMIN,WMAX-WMIN)))
LOCATE VALUE NOWAIT(1),RANGE 0 TO 3,AT 1:SCALE
LOCATE VALUE NOWAIT(2),RANGE -RANGE TO RANGE,AT 0:XMOVE
LOCATE VALUE NOWAIT(3),RANGE -RANGE TO RANGE,AT 0:YMOVE
LOCATE VALUE NOWAIT(4),RANGE -RANGE TO RANGE,AT 0:ZMOVE
LOCATE VALUE NOWAIT(5),RANGE -RANGE TO RANGE,AT 0:WMOVE
LOCATE VALUE NOWAIT(6),RANGE -360 TO 360,AT 0:XY
LOCATE VALUE NOWAIT(7),RANGE -360 TO 360,AT 0:XZ
LOCATE VALUE NOWAIT(8),RANGE -360 TO 360,AT 0:YW
LOCATE VALUE NOWAIT(9),RANGE -360 TO 360,AT 0:YZ
LOCATE VALUE NOWAIT(10),RANGE -360 TO 360,AT 0:XW
LOCATE VALUE NOWAIT(11),RANGE -360 TO 360,AT 0:ZW
DO
LOCATE VALUE NOWAIT(1):SCALE
LOCATE VALUE NOWAIT(2):XMOVE
LOCATE VALUE NOWAIT(3):YMOVE
LOCATE VALUE NOWAIT(4):ZMOVE
LOCATE VALUE NOWAIT(5):WMOVE
LOCATE VALUE NOWAIT(6):XY
LOCATE VALUE NOWAIT(7):XZ
LOCATE VALUE NOWAIT(8):YW
LOCATE VALUE NOWAIT(9):YZ
LOCATE VALUE NOWAIT(10):XW
LOCATE VALUE NOWAIT(11):ZW
MAT ROTXY=IDN !'XY平面上の回転(ZW平面を軸とする回転)
LET ROTXY(1,1)=COS(XY)
LET ROTXY(1,2)=SIN(XY)
LET ROTXY(2,1)=-SIN(XY)
LET ROTXY(2,2)=COS(XY)
MAT ROTXZ=IDN !'XZ平面上の回転(YW平面を軸とする回転)
LET ROTXZ(1,1)=COS(XZ)
LET ROTXZ(1,3)=-SIN(XZ)
LET ROTXZ(3,1)=SIN(XZ)
LET ROTXZ(3,3)=COS(XZ)
MAT ROTYW=IDN !'YW平面上の回転(XZ平面を軸とする回転)
LET ROTYW(2,2)=COS(YW)
LET ROTYW(2,4)=-SIN(YW)
LET ROTYW(4,2)=SIN(YW)
LET ROTYW(4,4)=COS(YW)
MAT ROTYZ=IDN !'YZ平面上の回転(XW平面を軸とする回転)
LET ROTYZ(2,2)=COS(YZ)
LET ROTYZ(2,3)=SIN(YZ)
LET ROTYZ(3,2)=-SIN(YZ)
LET ROTYZ(3,3)=COS(YZ)
MAT ROTXW=IDN !'XW平面上の回転(YZ平面を軸とする回転)
LET ROTXW(1,1)=COS(XW)
LET ROTXW(1,4)=SIN(XW)
LET ROTXW(4,1)=-SIN(XW)
LET ROTXW(4,4)=COS(XW)
MAT ROTZW=IDN !'ZW平面上の回転(XY平面を軸とする回転)
LET ROTZW(3,3)=COS(ZW)
LET ROTZW(3,4)=-SIN(ZW)
LET ROTZW(4,3)=SIN(ZW)
LET ROTZW(4,4)=COS(ZW)
MAT M=ROTXY*ROTXZ*ROTYW*ROTYZ*ROTXW*ROTZW ! 4次元回転
SET DRAW MODE HIDDEN
CLEAR
FOR I=1 TO NUM
CALL PLOT(X(MESH(I,1)+1),Y(MESH(I,1)+1),Z(MESH(I,1)+1),W(MESH(I,1)+1))
CALL PLOT(X(MESH(I,2)+1),Y(MESH(I,2)+1),Z(MESH(I,2)+1),W(MESH(I,2)+1))
CALL PLOT(X(MESH(I,3)+1),Y(MESH(I,3)+1),Z(MESH(I,3)+1),W(MESH(I,3)+1))
CALL PLOT(X(MESH(I,1)+1),Y(MESH(I,1)+1),Z(MESH(I,1)+1),W(MESH(I,1)+1))
PLOT LINES
NEXT I
IF FL=0 THEN
SET WINDOW -LMAX*1.2,LMAX*1.2,-LMAX*1.2,LMAX*1.2
LET FL=1
END IF
SET DRAW MODE EXPLICIT
LOOP

SUB PLOT(X,Y,Z,W)
LET LW=2
LET POINT(1)=X-XMOVE
LET POINT(2)=Y-YMOVE
LET POINT(3)=Z-ZMOVE
LET POINT(4)=W-WMOVE
MAT POINT=POINT*M
! FOR K=1 TO 3
! LET POINT(K)=POINT(K)/(LW-POINT(4))
! NEXT
IF FL=0 THEN
LET LMIN=MIN(LMIN,POINT(1))
LET LMAX=MAX(LMAX,POINT(1))
LET LMIN=MIN(LMIN,POINT(2))
LET LMAX=MAX(LMAX,POINT(2))
ELSE
PLOT LINES:POINT(1)*SCALE,POINT(2)*SCALE; ! X-Y平面
END IF
END SUB
END

Re: 4次元グラフィックス - しばっち

2026/07/05 (Sun) 07:47:08

八胞体を表示します。


https://ja.wikipedia.org/wiki/正八胞体


OPTION ANGLE DEGREES
LET LMIN=1E+10
LET LMAX=-1E+10
DIM M(4,4),POINT(4),ROTXY(4,4),ROTXZ(4,4),ROTYW(4,4),ROTYZ(4,4),ROTXW(4,4),ROTZW(4,4)
DIM X(50),Y(50),Z(50),W(50),MESH(50,10)
FOR I=1 TO 16
READ X(I),Y(I),Z(I),W(I)
LET XMAX=MAX(X(I),XMAX)
LET XMIN=MIN(X(I),XMIN)
LET YMAX=MAX(Y(I),YMAX)
LET YMIN=MIN(Y(I),YMIN)
LET ZMAX=MAX(Z(I),ZMAX)
LET ZMIN=MIN(Z(I),ZMIN)
LET WMAX=MAX(W(I),WMAX)
LET WMIN=MIN(W(I),WMIN)
NEXT I
DATA -0.5,-0.5,-0.5,-0.5
DATA -0.5,-0.5,-0.5,0.5
DATA -0.5,-0.5,0.5,-0.5
DATA -0.5,-0.5,0.5,0.5
DATA -0.5,0.5,-0.5,-0.5
DATA -0.5,0.5,-0.5,0.5
DATA -0.5,0.5,0.5,-0.5
DATA -0.5,0.5,0.5,0.5
DATA 0.5,-0.5,-0.5,-0.5
DATA 0.5,-0.5,-0.5,0.5
DATA 0.5,-0.5,0.5,-0.5
DATA 0.5,-0.5,0.5,0.5
DATA 0.5,0.5,-0.5,-0.5
DATA 0.5,0.5,-0.5,0.5
DATA 0.5,0.5,0.5,-0.5
DATA 0.5,0.5,0.5,0.5

DO
READ IF MISSING THEN EXIT DO:N
LET NUM=NUM+1
FOR I=1 TO N
READ MESH(NUM,I)
NEXT I
LOOP
DATA 4,0,2,3,1
DATA 4,0,4,5,1
DATA 4,0,4,6,2
DATA 4,0,8,9,1
DATA 4,0,8,10,2
DATA 4,0,8,12,4
DATA 4,4,6,7,5
DATA 4,2,6,7,3
DATA 4,1,5,7,3
DATA 4,2,10,11,3
DATA 4,1,9,11,3
DATA 4,1,9,13,5
DATA 4,8,10,11,9
DATA 4,8,12,13,9
DATA 4,8,12,14,10
DATA 4,4,12,13,5
DATA 4,4,12,14,6
DATA 4,2,10,14,6
DATA 4,12,14,15,13
DATA 4,10,14,15,11
DATA 4,9,13,15,11
DATA 4,6,14,15,7
DATA 4,5,13,15,7
DATA 4,3,11,15,7
LET RANGE=MAX(XMAX-XMIN,MAX(YMAX-YMIN,MAX(ZMAX-ZMIN,WMAX-WMIN)))
LOCATE VALUE NOWAIT(1),RANGE 0 TO 3,AT 1:SCALE
LOCATE VALUE NOWAIT(2),RANGE -RANGE TO RANGE,AT 0:XMOVE
LOCATE VALUE NOWAIT(3),RANGE -RANGE TO RANGE,AT 0:YMOVE
LOCATE VALUE NOWAIT(4),RANGE -RANGE TO RANGE,AT 0:ZMOVE
LOCATE VALUE NOWAIT(5),RANGE -RANGE TO RANGE,AT 0:WMOVE
LOCATE VALUE NOWAIT(6),RANGE -360 TO 360,AT 0:XY
LOCATE VALUE NOWAIT(7),RANGE -360 TO 360,AT 0:XZ
LOCATE VALUE NOWAIT(8),RANGE -360 TO 360,AT 0:YW
LOCATE VALUE NOWAIT(9),RANGE -360 TO 360,AT 0:YZ
LOCATE VALUE NOWAIT(10),RANGE -360 TO 360,AT 0:XW
LOCATE VALUE NOWAIT(11),RANGE -360 TO 360,AT 0:ZW
DO
LOCATE VALUE NOWAIT(1):SCALE
LOCATE VALUE NOWAIT(2):XMOVE
LOCATE VALUE NOWAIT(3):YMOVE
LOCATE VALUE NOWAIT(4):ZMOVE
LOCATE VALUE NOWAIT(5):WMOVE
LOCATE VALUE NOWAIT(6):XY
LOCATE VALUE NOWAIT(7):XZ
LOCATE VALUE NOWAIT(8):YW
LOCATE VALUE NOWAIT(9):YZ
LOCATE VALUE NOWAIT(10):XW
LOCATE VALUE NOWAIT(11):ZW
MAT ROTXY=IDN !'XY平面上の回転(ZW平面を軸とする回転)
LET ROTXY(1,1)=COS(XY)
LET ROTXY(1,2)=SIN(XY)
LET ROTXY(2,1)=-SIN(XY)
LET ROTXY(2,2)=COS(XY)
MAT ROTXZ=IDN !'XZ平面上の回転(YW平面を軸とする回転)
LET ROTXZ(1,1)=COS(XZ)
LET ROTXZ(1,3)=-SIN(XZ)
LET ROTXZ(3,1)=SIN(XZ)
LET ROTXZ(3,3)=COS(XZ)
MAT ROTYW=IDN !'YW平面上の回転(XZ平面を軸とする回転)
LET ROTYW(2,2)=COS(YW)
LET ROTYW(2,4)=-SIN(YW)
LET ROTYW(4,2)=SIN(YW)
LET ROTYW(4,4)=COS(YW)
MAT ROTYZ=IDN !'YZ平面上の回転(XW平面を軸とする回転)
LET ROTYZ(2,2)=COS(YZ)
LET ROTYZ(2,3)=SIN(YZ)
LET ROTYZ(3,2)=-SIN(YZ)
LET ROTYZ(3,3)=COS(YZ)
MAT ROTXW=IDN !'XW平面上の回転(YZ平面を軸とする回転)
LET ROTXW(1,1)=COS(XW)
LET ROTXW(1,4)=SIN(XW)
LET ROTXW(4,1)=-SIN(XW)
LET ROTXW(4,4)=COS(XW)
MAT ROTZW=IDN !'ZW平面上の回転(XY平面を軸とする回転)
LET ROTZW(3,3)=COS(ZW)
LET ROTZW(3,4)=-SIN(ZW)
LET ROTZW(4,3)=SIN(ZW)
LET ROTZW(4,4)=COS(ZW)
MAT M=ROTXY*ROTXZ*ROTYW*ROTYZ*ROTXW*ROTZW ! 4次元回転
SET DRAW MODE HIDDEN
CLEAR
FOR I=1 TO NUM
CALL PLOT(X(MESH(I,1)+1),Y(MESH(I,1)+1),Z(MESH(I,1)+1),W(MESH(I,1)+1))
CALL PLOT(X(MESH(I,2)+1),Y(MESH(I,2)+1),Z(MESH(I,2)+1),W(MESH(I,2)+1))
CALL PLOT(X(MESH(I,3)+1),Y(MESH(I,3)+1),Z(MESH(I,3)+1),W(MESH(I,3)+1))
CALL PLOT(X(MESH(I,4)+1),Y(MESH(I,4)+1),Z(MESH(I,4)+1),W(MESH(I,4)+1))
CALL PLOT(X(MESH(I,1)+1),Y(MESH(I,1)+1),Z(MESH(I,1)+1),W(MESH(I,1)+1))
PLOT LINES
NEXT I
IF FL=0 THEN
SET WINDOW -LMAX*1.2,LMAX*1.2,-LMAX*1.2,LMAX*1.2
LET FL=1
END IF
SET DRAW MODE EXPLICIT
LOOP

SUB PLOT(X,Y,Z,W)
LET LW=2
LET POINT(1)=X-XMOVE
LET POINT(2)=Y-YMOVE
LET POINT(3)=Z-ZMOVE
LET POINT(4)=W-WMOVE
MAT POINT=POINT*M
! FOR K=1 TO 3
! LET POINT(K)=POINT(K)/(LW-POINT(4))
! NEXT
IF FL=0 THEN
LET LMIN=MIN(LMIN,POINT(1))
LET LMAX=MAX(LMAX,POINT(1))
LET LMIN=MIN(LMIN,POINT(2))
LET LMAX=MAX(LMAX,POINT(2))
ELSE
PLOT LINES:POINT(1)*SCALE,POINT(2)*SCALE;
END IF
END SUB
END

Re: 4次元グラフィックス - しばっち

2026/07/05 (Sun) 07:48:22

十六胞体

https://ja.wikipedia.org/wiki/正十六胞体

以下データのみ



DATA -1,0,0,0
DATA 0,-1,0,0
DATA 0,0,-1,0
DATA 0,0,0,-1
DATA 1,0,0,0
DATA 0,1,0,0
DATA 0,0,1,0
DATA 0,0,0,1



DATA 3,5,6,7
DATA 3,4,6,7
DATA 3,4,5,7
DATA 3,4,5,6
DATA 3,0,6,7
DATA 3,0,5,7
DATA 3,0,5,6
DATA 3,1,6,7
DATA 3,1,4,7
DATA 3,1,4,6
DATA 3,0,1,7
DATA 3,0,1,6
DATA 3,2,5,7
DATA 3,2,4,7
DATA 3,2,4,5
DATA 3,0,2,7
DATA 3,0,2,5
DATA 3,1,2,7
DATA 3,1,2,4
DATA 3,0,1,2
DATA 3,3,5,6
DATA 3,3,4,6
DATA 3,3,4,5
DATA 3,0,3,6
DATA 3,0,3,5
DATA 3,1,3,6
DATA 3,1,3,4
DATA 3,0,1,3
DATA 3,2,3,5
DATA 3,2,3,4
DATA 3,0,2,3
DATA 3,1,2,3

Re: 4次元グラフィックス - しばっち

2026/07/05 (Sun) 07:49:44

二十四胞体


https://ja.wikipedia.org/wiki/正二十四胞体

以下データのみ


DATA -1,0,0,0
DATA 0,-1,0,0
DATA 0,0,-1,0
DATA 0,0,0,-1
DATA 1,0,0,0
DATA 0,1,0,0
DATA 0,0,1,0
DATA 0,0,0,1
DATA -0.5,-0.5,-0.5,-0.5
DATA -0.5,-0.5,-0.5,0.5
DATA -0.5,-0.5,0.5,-0.5
DATA -0.5,-0.5,0.5,0.5
DATA -0.5,0.5,-0.5,-0.5
DATA -0.5,0.5,-0.5,0.5
DATA -0.5,0.5,0.5,-0.5
DATA -0.5,0.5,0.5,0.5
DATA 0.5,-0.5,-0.5,-0.5
DATA 0.5,-0.5,-0.5,0.5
DATA 0.5,-0.5,0.5,-0.5
DATA 0.5,-0.5,0.5,0.5
DATA 0.5,0.5,-0.5,-0.5
DATA 0.5,0.5,-0.5,0.5
DATA 0.5,0.5,0.5,-0.5
DATA 0.5,0.5,0.5,0.5


DATA 3,0,8,9
DATA 3,0,8,10
DATA 3,1,8,9
DATA 3,1,8,10
DATA 3,0,10,11
DATA 3,0,9,11
DATA 3,1,10,11
DATA 3,1,9,11
DATA 3,0,8,12
DATA 3,2,8,9
DATA 3,2,8,12
DATA 3,0,12,13
DATA 3,0,9,13
DATA 3,2,9,13
DATA 3,2,12,13
DATA 3,3,8,10
DATA 3,3,8,12
DATA 3,0,12,14
DATA 3,0,10,14
DATA 3,3,12,14
DATA 3,3,10,14
DATA 3,1,8,16
DATA 3,2,8,16
DATA 3,1,9,17
DATA 3,2,9,17
DATA 3,1,16,17
DATA 3,2,16,17
DATA 3,3,8,16
DATA 3,1,10,18
DATA 3,1,16,18
DATA 3,3,16,18
DATA 3,3,10,18
DATA 3,2,16,20
DATA 3,3,16,20
DATA 3,2,12,20
DATA 3,3,12,20
DATA 3,0,14,15
DATA 3,0,13,15
DATA 3,5,12,13
DATA 3,5,12,14
DATA 3,5,14,15
DATA 3,5,13,15
DATA 3,0,11,15
DATA 3,6,10,11
DATA 3,6,10,14
DATA 3,6,14,15
DATA 3,6,11,15
DATA 3,7,9,11
DATA 3,7,9,13
DATA 3,7,13,15
DATA 3,7,11,15
DATA 3,1,11,19
DATA 3,1,18,19
DATA 3,6,10,18
DATA 3,6,18,19
DATA 3,6,11,19
DATA 3,7,9,17
DATA 3,1,17,19
DATA 3,7,17,19
DATA 3,7,11,19
DATA 3,2,17,21
DATA 3,2,13,21
DATA 3,7,17,21
DATA 3,7,13,21
DATA 3,4,16,17
DATA 3,4,16,18
DATA 3,4,18,19
DATA 3,4,17,19
DATA 3,4,16,20
DATA 3,2,20,21
DATA 3,4,20,21
DATA 3,4,17,21
DATA 3,3,20,22
DATA 3,3,18,22
DATA 3,4,20,22
DATA 3,4,18,22
DATA 3,5,12,20
DATA 3,5,20,21
DATA 3,5,13,21
DATA 3,3,14,22
DATA 3,5,20,22
DATA 3,5,14,22
DATA 3,6,18,22
DATA 3,6,14,22
DATA 3,4,22,23
DATA 3,4,21,23
DATA 3,5,22,23
DATA 3,5,21,23
DATA 3,4,19,23
DATA 3,6,22,23
DATA 3,6,19,23
DATA 3,7,21,23
DATA 3,7,19,23
DATA 3,5,15,23
DATA 3,6,15,23
DATA 3,7,15,23

Re: 4次元グラフィックス - しばっち

2026/07/05 (Sun) 07:51:04

4次元トーラス



OPTION ANGLE DEGREES
LET LMIN=1E+10
LET LMAX=-1E+10
LET NN=40 !'分割数
LET MM=40
DIM M(4,4),POINT(4),ROTXY(4,4),ROTXZ(4,4),ROTYU(4,4),ROTYZ(4,4),ROTXU(4,4),ROTZU(4,4)
DIM XX(0 TO NN,0 TO MM),YY(0 TO NN,0 TO MM),ZZ(0 TO NN,0 TO MM),WW(0 TO NN,0 TO MM)
SET POINT STYLE 1
FOR J=0 TO MM
FOR I=0 TO NN
LET ALPHA=I*360/NN
LET BETA=J*360/MM
LET XX(I,J)=COS(ALPHA)
LET YY(I,J)=SIN(ALPHA)
LET ZZ(I,J)=COS(BETA)
LET WW(I,J)=SIN(BETA)
LET XMIN=MIN(XMIN,XX(I,J))
LET XMAX=MAX(XMAX,XX(I,J))
LET YMIN=MIN(YMIN,YY(I,J))
LET YMAX=MAX(YMAX,YY(I,J))
LET ZMIN=MIN(ZMIN,ZZ(I,J))
LET ZMAX=MAX(ZMAX,ZZ(I,J))
LET WMIN=MIN(WMIN,WW(I,J))
LET WMAX=MAX(WMAX,WW(I,J))
NEXT I
NEXT J
LET RANGE=MAX(XMAX-XMIN,MAX(YMAX-YMIN,MAX(ZMAX-ZMIN,WMAX-WMIN)))
LOCATE VALUE NOWAIT(1),RANGE 0 TO 3,AT 1:SCALE
LOCATE VALUE NOWAIT(2),RANGE -RANGE TO RANGE,AT 0:XMOVE
LOCATE VALUE NOWAIT(3),RANGE -RANGE TO RANGE,AT 0:YMOVE
LOCATE VALUE NOWAIT(4),RANGE -RANGE TO RANGE,AT 0:ZMOVE
LOCATE VALUE NOWAIT(5),RANGE -RANGE TO RANGE,AT 0:WMOVE
LOCATE VALUE NOWAIT(6),RANGE -360 TO 360,AT 0:XY
LOCATE VALUE NOWAIT(7),RANGE -360 TO 360,AT 0:XZ
LOCATE VALUE NOWAIT(8),RANGE -360 TO 360,AT 0:YU
LOCATE VALUE NOWAIT(9),RANGE -360 TO 360,AT 0:YZ
LOCATE VALUE NOWAIT(10),RANGE -360 TO 360,AT 0:XU
LOCATE VALUE NOWAIT(11),RANGE -360 TO 360,AT 0:ZU
DO
LOCATE VALUE NOWAIT(1):SCALE
LOCATE VALUE NOWAIT(2):XMOVE
LOCATE VALUE NOWAIT(3):YMOVE
LOCATE VALUE NOWAIT(4):ZMOVE
LOCATE VALUE NOWAIT(5):WMOVE
LOCATE VALUE NOWAIT(6):XY
LOCATE VALUE NOWAIT(7):XZ
LOCATE VALUE NOWAIT(8):YU
LOCATE VALUE NOWAIT(9):YZ
LOCATE VALUE NOWAIT(10):XU
LOCATE VALUE NOWAIT(11):ZU
MAT ROTXY=IDN !'XY平面上の回転(ZU平面を軸とする回転)
LET ROTXY(1,1)=COS(XY)
LET ROTXY(1,2)=SIN(XY)
LET ROTXY(2,1)=-SIN(XY)
LET ROTXY(2,2)=COS(XY)
MAT ROTXZ=IDN !'XZ平面上の回転(YU平面を軸とする回転)
LET ROTXZ(1,1)=COS(XZ)
LET ROTXZ(1,3)=-SIN(XZ)
LET ROTXZ(3,1)=SIN(XZ)
LET ROTXZ(3,3)=COS(XZ)
MAT ROTYU=IDN !'YU平面上の回転(XZ平面を軸とする回転)
LET ROTYU(2,2)=COS(YU)
LET ROTYU(2,4)=-SIN(YU)
LET ROTYU(4,2)=SIN(YU)
LET ROTYU(4,4)=COS(YU)
MAT ROTYZ=IDN !'YZ平面上の回転(XU平面を軸とする回転)
LET ROTYZ(2,2)=COS(YZ)
LET ROTYZ(2,3)=SIN(YZ)
LET ROTYZ(3,2)=-SIN(YZ)
LET ROTYZ(3,3)=COS(YZ)
MAT ROTXU=IDN !'XU平面上の回転(YZ平面を軸とする回転)
LET ROTXU(1,1)=COS(XU)
LET ROTXU(1,4)=SIN(XU)
LET ROTXU(4,1)=-SIN(XU)
LET ROTXU(4,4)=COS(XU)
MAT ROTZU=IDN !'ZU平面上の回転(XY平面を軸とする回転)
LET ROTZU(3,3)=COS(ZU)
LET ROTZU(3,4)=-SIN(ZU)
LET ROTZU(4,3)=SIN(ZU)
LET ROTZU(4,4)=COS(ZU)
MAT M=ROTXY*ROTXZ*ROTYU*ROTYZ*ROTXU*ROTZU
SET DRAW MODE HIDDEN
CLEAR
FOR J=0 TO MM-1
FOR I=0 TO NN-1
CALL PLOT(XX(I,J),YY(I,J),ZZ(I,J),WW(I,J))
CALL PLOT(XX(I,J+1),YY(I,J+1),ZZ(I,J+1),WW(I,J+1))
CALL PLOT(XX(I+1,J+1),YY(I+1,J+1),ZZ(I+1,J+1),WW(I+1,J+1))
CALL PLOT(XX(I+1,J),YY(I+1,J),ZZ(I+1,J),WW(I+1,J))
CALL PLOT(XX(I,J),YY(I,J),ZZ(I,J),WW(I,J))
PLOT LINES
NEXT I
NEXT J
IF FL=0 THEN
SET WINDOW -LMAX*1.2,LMAX*1.2,-LMAX*1.2,LMAX*1.2
LET FL=1
END IF
SET DRAW MODE EXPLICIT
LOOP

SUB PLOT(X,Y,Z,W)
LET LW=2
LET POINT(1)=X-XMOVE
LET POINT(2)=Y-YMOVE
LET POINT(3)=Z-ZMOVE
LET POINT(4)=W-WMOVE
MAT POINT=POINT*M
! FOR K=1 TO 3
! LET POINT(K)=POINT(K)/(LW-POINT(4))
! NEXT
IF FL=0 THEN
LET LMIN=MIN(LMIN,POINT(1))
LET LMAX=MAX(LMAX,POINT(1))
LET LMIN=MIN(LMIN,POINT(2))
LET LMAX=MAX(LMAX,POINT(2))
ELSE
PLOT LINES:POINT(1)*SCALE,POINT(2)*SCALE;
END IF
END SUB
END

カラーパズルゲーム - しばっち

2026/06/14 (Sun) 07:36:50

マウスでマスをクリックするとその行と列の色が変わります。(黒→白→黄色→水色→緑→紫→赤→青→黒)
全てのマスを黒にすればクリアです。

シャッフル回数を入れるとゲーム開始です。
Rキーでリトライ(リスタート)します。
Gキーはギブアップで解答を表示して終わります。


DECLARE FUNCTION CHECK
RANDOMIZE
CALL GINIT(600,600)
SET TEXT JUSTIFY "CENTER","HALF"
SET TEXT BACKGROUND "OPAQUE"
LET SIZE=3
DIM M(SIZE,SIZE),T(SIZE,SIZE),XS(100),YS(100)
CALL DISPLAY
INPUT PROMPT "シャッフル回数(5-100)=":NN
FOR K=1 TO NN
LET X=INT(RND*SIZE+1)
LET Y=INT(RND*SIZE+1)
CALL CHANGE(X,Y,1)
LET XS(K)=X
LET YS(K)=Y
CALL DISPLAY
WAIT DELAY .1
NEXT K
MAT T=M
DO
DO
MOUSE POLL MX,MY,LEFT,RIGHT
IF GETKEYSTATE(ORD("R"))<0 OR GETKEYSTATE(ORD("r"))<0 THEN ! リトライ(リスタート)
MAT M=T
CALL DISPLAY
END IF
IF GETKEYSTATE(ORD("G"))<0 OR GETKEYSTATE(ORD("g"))<0 THEN ! ギブアップ
MAT M=T
CALL DISPLAY
FOR K=NN TO 1 STEP -1 ! 解答表示
CALL CHANGE(XS(K),YS(K),-1)
CALL DISPLAY
WAIT DELAY .5
NEXT K
SET TEXT HEIGHT 60
SET TEXT BACKGROUND "TRANSPARENT"
SET TEXT COLOR 2
PLOT TEXT ,AT 300,300:"Game Over!!"
STOP
END IF
LOOP UNTIL LEFT=1 OR RIGHT=1
DO
MOUSE POLL MX,MY,LEFT,RIGHT
LOOP WHILE LEFT=1 OR RIGHT=1
LET X=INT(MX/(600/SIZE))+1
LET Y=INT(MY/(600/SIZE))+1
CALL CHANGE(X,Y,-1)
CALL DISPLAY
LOOP UNTIL CHECK=1
SET TEXT HEIGHT 60
SET TEXT BACKGROUND "TRANSPARENT"
SET TEXT COLOR 2
PLOT TEXT ,AT 300,300:"Congratulations"

SUB DISPLAY ! 画面表示
FOR J=1 TO SIZE
FOR I=1 TO SIZE
CALL BOXFULL(600/SIZE*(I-1),600/SIZE*(J-1),600/SIZE*I,600/SIZE*J,M(I,J))
NEXT I
NEXT J
END SUB

FUNCTION CHECK ! 揃ったか?
FOR J=1 TO SIZE
FOR I=1 TO SIZE
IF M(I,J)<>0 THEN
LET CHECK=0
EXIT FUNCTION
END IF
NEXT I
NEXT J
LET CHECK=1
END FUNCTION

SUB CHANGE(X,Y,SIGN)
LET M(X,Y)=M(X,Y)+SIGN
IF M(X,Y)>7 THEN LET M(X,Y)=0
IF M(X,Y)<0 THEN LET M(X,Y)=7
FOR I=1 TO SIZE
IF I<>Y THEN LET M(X,I)=M(X,I)+SIGN
IF M(X,I)>7 THEN LET M(X,I)=0
IF M(X,I)<0 THEN LET M(X,I)=7
NEXT I
FOR I=1 TO SIZE
IF I<>X THEN LET M(I,Y)=M(I,Y)+SIGN
IF M(I,Y)>7 THEN LET M(I,Y)=0
IF M(I,Y)<0 THEN LET M(I,Y)=7
NEXT I
END SUB
END

EXTERNAL SUB GINIT(XSIZE,YSIZE)
SET BITMAP SIZE XSIZE,YSIZE
SET WINDOW 0,XSIZE-1,YSIZE-1,0
SET POINT STYLE 1
SET COLOR MODE "REGULAR"
FOR I=0 TO 7
SET COLOR MIX(I) BITAND(I,2)/2,BITAND(I,4)/4,BITAND(I,1)
NEXT I
CLEAR
END SUB

EXTERNAL SUB BOXFULL(X1,Y1,X2,Y2,C)
SET AREA COLOR C
PLOT AREA:X1,Y1;X2,Y1;X2,Y2;X1,Y2;X1,Y1
END SUB

PLOT LINESの使い方 - 島村1243

2026/06/02 (Tue) 07:42:57

下記のコードで三角(鋸り)波の表示をしたいのですが、wt=PIのときの縦垂直線がずれてしまいます。
何処にコード誤記が有るのかが分からず困っています。
初歩のお尋ねで申し訳ありませんがご教示頂けると有り難いです。

SET WINDOW -0.1*PI,2.1*PI,-1.5,1.5
DRAW grid(PI/2,0.5)
LET nMax=100
LET dwt=2*PI/nMax
FOR k=0 TO nMax
LET wt=k*dwt
IF wt<PI THEN PLOT LINES:wt,wt/PI;
IF wt=PI THEN !---縦垂直線の処理
PLOT LINES:wt,1;
PLOT LINES:wt,0;
END IF
IF wt>PI THEN PLOT LINES:wt,(wt-PI)/PI;
NEXT K
PLOT LINES

END

Re: PLOT LINESの使い方 SHIRAISHI Kazuo

2026/06/02 (Tue) 08:06:12

LET nMax=100
LET dwt=2*PI/nMax
FOR k=0 TO nMax
LET wt=k*dwt
PRINT k, wt-PI
NEXT K
END
を実行してみるとわかりますが,wt=PIになることがないのが原因のような気がします。
wtの値で分類するのでなく,kの値で分類すればうまくいくと思います。
(補足)
組込関数PIは16桁を超える精度を持っていますが,数値変数wtは15桁の精度で丸められます。
具体的には,PI=3.141592653589793238ですが,
k=50のとき,wt=3.1415926535898です。
だから,k=50のとき,wt>PIです。

Re: PLOT LINESの使い方 - 島村1243

2026/06/02 (Tue) 10:38:53

SHRAISHI先生、早速のご教示有難う御座いました。
ご教示に従って、For Next を下記の様に修正したら、目的を達成できました!!!

FOR k=0 TO nMax
LET wt=k*dwt
IF k<nMax/2 THEN PLOT LINES:wt,wt/PI;
IF k=nMax/2 THEN !---縦垂直線の処理
PLOT LINES:wt,1;
PLOT LINES:wt,0;
END IF
IF k>nMax/2 THEN PLOT LINES:wt,(wt-PI)/PI;
NEXT K

文字探しゲーム - しばっち

2026/05/31 (Sun) 07:40:57

文字探しゲーム


文字の中からマウスで「デ」と「レ」を探しだすゲームです。
全部見つけたと思ったら「完了」をクリックすると判定されます。

すばやく見つけて間違えず見過ごさないことが試されます。


RANDOMIZE
DIM A$(100),M$(50,50)
FOR I=1 TO 3
READ D$
FOR J=1 TO LEN(D$)
LET K=K+1
LET A$(K)=MID$(D$,J,1)
NEXT J
NEXT I
CALL GINIT(600,600)
LET H=40
SET TEXT JUSTIFY "LEFT","TOP"
SET TEXT COLOR 7
SET TEXT HEIGHT H*.8
DATA "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン"
DATA "ガギグゲゴザジズゼゾダヂヅデドバビブベボ"
DATA "パピプペポデレデレデレデレデレデレ"
FOR Y=0 TO 400 STEP H
FOR X=0 TO 600 STEP H
LET S$=A$(INT(RND*K)+1)
LET M$(X/H+1,Y/H+1)=S$
PLOT TEXT,AT X,Y:S$
NEXT X
NEXT Y
CALL BOX(450,500,450+H*2,550,7)
PLOT TEXT,AT 450,500:"完了"
LET T=TIME
DO
SET TEXT COLOR 7
SET TEXT BACKGROUND "OPAQUE"
PLOT TEXT,AT 30,450:"MISS "&USING$("%%%",MISS)
PLOT TEXT,AT 30,500:"SCORE "&USING$("%%%",HIT)
DO
MOUSE POLL X,Y,LEFT,RIGHT
LOOP UNTIL RIGHT=1 OR LEFT=1
DO
MOUSE POLL X,Y,LEFT,RIGHT
LOOP WHILE RIGHT=1 OR LEFT=1
IF X>450 AND X<530 AND Y>500 AND Y<550 THEN
FOR I=1 TO INT(600/H)
FOR J=1 TO INT((400+H)/H)
IF M$(I,J)="デ" OR M$(I,J)="レ" THEN
SET TEXT COLOR 4
PLOT TEXT ,AT (I-1)*H,(J-1)*H:M$(I,J)
LET MISS=MISS+1
END IF
NEXT J
NEXT I
SET TEXT COLOR 7
PLOT TEXT,AT 30,450:"MISS "&USING$("%%%",MISS)
PLOT TEXT,AT 30,500:"SCORE "&USING$("%%%",HIT)
PLOT TEXT,AT 30,550:"TIME "&USING$("%%",INT((TIME-T)/60)) &":"&USING$("%%",MOD(INT(TIME-T),60))
STOP
END IF
LET XX=INT(X/H)
LET YY=INT(Y/H)
IF M$(XX+1,YY+1)="デ" OR M$(XX+1,YY+1)="レ" THEN
SET TEXT COLOR 0
PLOT TEXT,AT XX*H,YY*H:M$(INT(X/H)+1,INT(Y/H)+1)
LET M$(INT(X/H)+1,INT(Y/H)+1)=""
LET HIT=HIT+1
ELSE
SET TEXT COLOR 2
PLOT TEXT,AT XX*H,YY*H:M$(INT(X/H)+1,INT(Y/H)+1)
LET M$(INT(X/H)+1,INT(Y/H)+1)=""
LET MISS=MISS+1
END IF
LOOP
END

EXTERNAL SUB GINIT(XSIZE,YSIZE)
SET BITMAP SIZE XSIZE,YSIZE
SET WINDOW 0,XSIZE-1,YSIZE-1,0
SET POINT STYLE 1
SET COLOR MODE "REGULAR"
SET COLOR MIX(0) 0,0,0
SET COLOR MIX(1) 0,0,1
SET COLOR MIX(2) 1,0,0
SET COLOR MIX(3) 1,0,1
SET COLOR MIX(4) 0,1,0
SET COLOR MIX(5) 0,1,1
SET COLOR MIX(6) 1,1,0
SET COLOR MIX(7) 1,1,1
SET COLOR MIX(8) 58/255,110/255,165/255
SET COLOR MIX(9) 212/255,208/255,200/255
CLEAR
END SUB

EXTERNAL SUB LINE(XS,YS,XE,YE,C)
SET COLOR C
PLOT LINES
PLOT LINES:XS,YS;XE,YE
END SUB

EXTERNAL SUB BOX(XS,YS,XE,YE,C)
CALL LINE(XS,YS,XE,YS,C)
CALL LINE(XE,YS,XE,YE,C)
CALL LINE(XE,YE,XS,YE,C)
CALL LINE(XS,YE,XS,YS,C)
END SUB

Re: 文字探しゲーム - しばっち

2026/05/31 (Sun) 07:42:41

指定された文字を探し出しクリックします。
全部見つけたと思ったら「完了」をクリックすると判定されます。

難易度を上げる為に回転文字や反転文字等も含まれています。


OPTION ANGLE DEGREES
RANDOMIZE
LET COL=15
LET ROW=10
DIM A$(200),M$(COL,ROW),R(COL,ROW),MOJI$(5),SX(COL,ROW),SY(COL,ROW)
DO
READ IF MISSING THEN EXIT DO:D$
FOR J=1 TO LEN(D$)
LET K=K+1
LET A$(K)=MID$(D$,J,1)
NEXT J
LOOP
CALL GINIT(600,600)
LET N=INT(RND*4+2)
FOR I=1 TO N
LET MOJI$(I)=A$(RND*K+1)
NEXT I
DATA "あいうえおかがきぎくぐけげこごさざしじすずせぜそぞただちぢつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもやゆよらりるれろわゐゑをん"
DATA "アイウヴエオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモヤユヨラリルレロワヰヱヲン"
LET H=80
SET TEXT JUSTIFY "LEFT","TOP"
SET TEXT COLOR 7
SET TEXT HEIGHT H*.8
FOR I=0 TO N-1
PLOT TEXT ,AT 50+100*I,500:MOJI$(I+1)
NEXT I
LET H=MIN(600/COL,600/ROW)
SET TEXT HEIGHT H*.8
PLOT TEXT ,AT 50,200:"を探してください"
DO
MOUSE POLL X,Y,LEFT,RIGHT
LOOP UNTIL RIGHT=1 OR LEFT=1
DO
MOUSE POLL X,Y,LEFT,RIGHT
LOOP WHILE RIGHT=1 OR LEFT=1
CLEAR
SET TEXT JUSTIFY "CENTER","HALF"
FOR J=0 TO ROW-1
FOR I=0 TO COL-1
IF RND<.4 THEN LET S$=MOJI$(INT(RND*N)+1) ELSE LET S$=A$(INT(RND*K)+1)
LET M$(I+1,J+1)=S$
LET R(I+1,J+1)=90*INT(RND*4)
LET SX(I+1,J+1)=(-1)^INT(2*RND)
LET SY(I+1,J+1)=(-1)^INT(2*RND)
DRAW WORD(S$) WITH ROTATE(R(I+1,J+1))*SCALE(SX(I+1,J+1),SY(I+1,J+1))*SHIFT(H/2+I*H,H/2+J*H+200)
NEXT I
NEXT J
SET TEXT JUSTIFY "LEFT","TOP"
CALL BOX(450,100,450+H*2,50,7)
PLOT TEXT,AT 450,100:"完了"
SET TEXT BACKGROUND "OPAQUE"
LET T=TIME
DO
SET TEXT JUSTIFY "LEFT","TOP"
SET TEXT COLOR 7
PLOT TEXT,AT 0,100:"MISS "&USING$("%%%",MISS)
PLOT TEXT,AT 0,50:"SCORE "&USING$("%%%",HIT)
SET TEXT JUSTIFY "CENTER","HALF"
DO
MOUSE POLL X,Y,LEFT,RIGHT
LOOP UNTIL RIGHT=1 OR LEFT=1
DO
MOUSE POLL X,Y,LEFT,RIGHT
LOOP WHILE RIGHT=1 OR LEFT=1
IF X>450 AND X<530 AND Y>50 AND Y<100 THEN ! 完了をクリックしたら
FOR J=0 TO ROW-1
FOR I=0 TO COL-1
FOR L=1 TO N
IF M$(I+1,J+1)=MOJI$(L) THEN
SET TEXT COLOR 4
DRAW WORD(M$(I+1,J+1)) WITH ROTATE(R(I+1,J+1))*SCALE(SX(I+1,J+1),SY(I+1,J+1))*SHIFT(H/2+I*H,H/2+200+J*H)
LET MISS=MISS+1
END IF
NEXT L
NEXT I
NEXT J
SET TEXT JUSTIFY "LEFT","TOP"
SET TEXT COLOR 7
PLOT TEXT,AT 0,150:"TIME "&USING$("%%",INT((TIME-T)/60)) &":"&USING$("%%",MOD(INT(TIME-T),60))
PLOT TEXT,AT 0,100:"MISS "&USING$("%%%",MISS)
PLOT TEXT,AT 0,50:"SCORE "&USING$("%%%",HIT)
STOP
END IF
LET XX=INT(X/H)
LET YY=INT((Y-200)/H)
LET FL=0
FOR L=1 TO N
IF M$(XX+1,YY+1)=MOJI$(L) THEN LET FL=1
NEXT L
IF FL=1 THEN
SET TEXT COLOR 0
DRAW WORD(M$(XX+1,YY+1)) WITH ROTATE(R(XX+1,YY+1))*SCALE(SX(XX+1,YY+1),SY(XX+1,YY+1))*SHIFT(H/2+XX*H,200+H/2+YY*H)
LET M$(XX+1,YY+1)=""
LET HIT=HIT+1
ELSE
SET TEXT COLOR 2
DRAW WORD(M$(XX+1,YY+1)) WITH ROTATE(R(XX+1,YY+1))*SCALE(SX(XX+1,YY+1),SY(XX+1,YY+1))*SHIFT(H/2+XX*H,200+H/2+YY*H)
LET M$(XX+1,YY+1)=""
LET MISS=MISS+1
END IF
LOOP
END

EXTERNAL SUB GINIT(XSIZE,YSIZE)
SET BITMAP SIZE XSIZE,YSIZE
SET WINDOW 0,XSIZE-1,0,YSIZE-1
SET POINT STYLE 1
SET COLOR MODE "REGULAR"
SET COLOR MIX(0) 0,0,0
SET COLOR MIX(1) 0,0,1
SET COLOR MIX(2) 1,0,0
SET COLOR MIX(3) 1,0,1
SET COLOR MIX(4) 0,1,0
SET COLOR MIX(5) 0,1,1
SET COLOR MIX(6) 1,1,0
SET COLOR MIX(7) 1,1,1
CLEAR
END SUB

EXTERNAL SUB BOXFULL(X1,Y1,X2,Y2,C)
SET COLOR C
PLOT AREA:X1,Y1;X2,Y1;X2,Y2;X1,Y2;X1,Y1
END SUB

EXTERNAL SUB LINE(XS,YS,XE,YE,C)
SET COLOR C
PLOT LINES
PLOT LINES:XS,YS;XE,YE
END SUB

EXTERNAL SUB BOX(XS,YS,XE,YE,C)
CALL LINE(XS,YS,XE,YS,C)
CALL LINE(XE,YS,XE,YE,C)
CALL LINE(XE,YE,XS,YE,C)
CALL LINE(XS,YE,XS,YS,C)
END SUB

EXTERNAL PICTURE WORD(A$)
PLOT LETTERS ,AT 0,0:A$
END PICTURE

三角関数値が異常です - しばっち

2026/04/12 (Sun) 07:39:59

三角関数値が異常です


WINDOWS版の十進BASIC(32ビット版) ver7880において
2進モード、複素数モードでの三角関数値が下記のように
異常な値になります。

10進モードでは問題ありませんでした。

精度不足が原因かと思われます。


LET B=15
LET X=1
FOR N=1 TO 30
PRINT N;COS(B^N*X*PI);SIN(B^N*X*PI)
NEXT N
END


     実行結果


1 -1 5.38962320953407E-15
2 -1 3.8211783997405E-14
3 -1 3.45803084517843E-13
4 -1 1.97389614961345E-11
5 -1 3.41499483314141E-11
6 -1 4.23753952343313E-9
7 -.999999999999999 3.37607704638016E-8
8 -.999999999999804 6.25620846507764E-7
9 -.999999999993294 3.66226679917138E-6
10 -.999999999958069 9.15763480006557E-6
11 -.999999647873398 -8.39197879495783E-4
12 -.999538539588589 3.03761070104653E-2
13 -.999019433754421 -4.42738182337559E-2
14 -.718394338073019 .695636093819627
15 -.871013768888734 -.491258602373783
16 2.06352634360854E+19 2.06352634360854E+19
17 3.09528951541281E+20 3.09528951541281E+20
18 4.64293427311922E+21 4.64293427311922E+21
19 6.96440140967883E+22 6.96440140967883E+22
20 1.04466021145182E+24 1.04466021145182E+24
21 1.56699031717774E+25 1.56699031717774E+25
22 2.35048547576661E+26 2.35048547576661E+26
23 3.52572821364991E+27 3.52572821364991E+27
24 5.28859232047486E+28 5.28859232047486E+28
25 7.9328884807123E+29 7.9328884807123E+29
26 1.18993327210684E+31 1.18993327210684E+31
27 1.78489990816027E+32 1.78489990816027E+32
28 2.6773498622404E+33 2.6773498622404E+33
29 4.0160247933606E+34 4.0160247933606E+34
30 6.0240371900409E+35 6.0240371900409E+35

Re: 三角関数値が異常です SHIRAISHI Kazuo

2026/04/12 (Sun) 08:53:30

ご報告ありがとうございした。
原因は,Intel FPUのFSIN,FCOS命令をそのまま使っていたことです。
マニュアルをよく読むと,引数は -2^63 ~ 2^63 の範囲でなければならないようです。
倍精度数の精度は53ビットなので,その範囲外の数値に対して三角関数の値を求めることは無意味ですが,どう扱うのが適切か,検討します。

Re: 三角関数値が異常です - しばっち

2026/04/19 (Sun) 07:55:10

周期性があるのでMOD関数を利用すれば計算自体は可能ですが
誤差が累積していくようです

https://ja.wikipedia.org/wiki/ワイエルシュトラス関数

LET B=23
LET X=.4
FOR I=1 TO 15
LET C=B^I*PI*X
LET X=COS(C)
LET Y=COS(MOD(C,2*PI))
PRINT I;X;Y;X-Y
NEXT I
END


実行結果


1 -.809016994374948 -.809016994374948 -5.55111512312578E-16
2 .99555901481267 .995559014812675 -4.88498130835069E-15
3 -.994477987872487 -.994477987872643 1.55653268052447E-13
4 .624271813435692 .624271813462338 -2.66459077025161E-11
5 5.18260078207372E-2 .051826008312573 -4.91835808191787E-10
6 -.903399056291523 -.903399055889035 -4.02487820849728E-10
7 .47391871819713 .473919049744119 -3.31546989085219E-7
8 -.922909753831513 -.922908005104853 -1.74872665914538E-6
9 .791479622428268 .791603979074663 -1.24356646394985E-4
10 -.556013013484207 -.552670804109104 -3.34220937510299E-3
11 .999592310690031 .999339079455446 2.53231234584206E-4
12 .774903379838499 -.974661220596496 1.74956460043499
13 -.526222536776585 .960170286650366 -1.48639282342695
14 -1.9165008703538E+19 -.653643620863612 -1.9165008703538E+19
15 -1.6053747716131E+40 1 -1.6053747716131E+40

Re: 三角関数値が異常です SHIRAISHI Kazuo

2026/04/19 (Sun) 09:21:09

Delphi7のsin, cosは引数の絶対値が2^63を超えるとどちらも値が0になります。(十進BASIC Ver.7 はアセンブラでFSIN, FCOSを使用していました)
lazarusで用いられるFPC (Free Pascal) のsin, cosは,Intel FPUを使う環境ではintel FPUの仕様そのままでした。
十進BASIC Ver.7,Ver.8の修正版では,2πで割った余りを求めてから三角関数の値を求めることにしました。
ただし,ここでのπは,64ビット精度の拡張精度数です。倍精度より少し高精度ですが,真の値ではありません。
引数の絶対値が大きいときでも計算結果は-1~1の範囲に納まりますが,数値自体はほぼ無意味です。
BASICAccとParact BASICは,当面,手を加えずFPCの計算に委ねることにしました。
なお,2πでの剰余を精密に計算したいときは,十進1000桁モードを使用してください。十進1000桁モードだとPIは1000桁超の精度を持ちます。

Re: 三角関数値が異常です SHIRAISHI Kazuo

2026/04/19 (Sun) 09:30:19

十進1000桁モードでの実行結果です。
OPTION ARITHMETIC DECIMAL_HIGH
LET B=15
LET X=1
FOR N=1 TO 30
PRINT N;COS(B^N*X*PI);SIN(B^N*X*PI)
NEXT N
END

1 -1 -.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092857116
2 -1 -.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000139285674
3 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208928511
4 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003133927665
5 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047008914975
6 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000705133724625
7 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010577005869375
8 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000158655088040625
9 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002379826320609375
10 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697394809140625
11 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000535460922137109375
12 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008031913832056640625
13 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120478707480849609375
14 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001807180612212744140625
15 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027107708454675537109375
16 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406615637747867431640625
17 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006099234566218011474609375
18 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091488518493270172119140625
19 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001372327777399052581787109375
20 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020584916660985788726806640625
21 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308773749914786830902099609375
22 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004631606248721802463531494140625
23 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069474093594296325474456787109375
24 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001042111405862226673116851806640625
25 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015631671089231921290752777099609375
26 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000234475066341508702147291656494140625
27 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003517125995123063372607374847412109375
28 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052756889926846599849707622711181640625
29 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000791353348902701594788002340667724609375
30 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011870300233540525653181627110015869140625

この結果が物語ることは,B^N*X*PIの計算結果と,sinを計算するときに十進BASIC内部で用いるπの精度の違いです。
十進BASICサンプルプログラムのQ&A\SIN_PI.BASも参照してください。
要するに,PI自体がπの近似値であること,そして,SINの計算精度が保証される範囲自体も狭いことです。
十進1000桁モードの機械最小値を1E-1017に設定しているのも,精度保証との関係です。

Re: 三角関数値が異常です SHIRAISHI Kazuo

2026/04/19 (Sun) 10:47:08

2進モードでのPIは,およそ3.141592653589793115999782457です。
この値を元にπの整数倍を計算していくと,10^16倍したとき,およそ-1.2ほどの誤差がでてきます。三角関数の値を求めるのには不適切な誤差です。
10進1000桁モードで計算してみてください。

OPTION ARITHMETIC Decimal_High
LET p=3.141592653589793115999782457
FOR i=0 TO 16
PRINT 10^i*p - 10^i*PI
NEXT i
END



Re: 三角関数値が異常です SHIRAISHI Kazuo

2026/04/19 (Sun) 14:55:24

三角関数の正確な値を求める基本は,xを2πで割った余りを正確に求めることです。
xを2*PIで割った商をq,余りをrとして,PI=π+eだとすると,
x=q*2*PI+r
PI=π+e
なので,
x=q*2*π+q*2*e+r
だから,xを2πで割った余りはq*2*e+rです。

Re: 三角関数値が異常です SHIRAISHI Kazuo

2026/04/22 (Wed) 07:57:17

PI≒πの近似誤差を気にせず計算したいときは,度を単位に計算することが推奨できます。
OPTION ANGLE DEGREES
FOR k=50 TO 60
LET x=180*2^k
PRINT k,x,COS(x),SIN(x)
NEXT k
END
2進モードでの実行結果は
50 2.02661983231672E+17 1 0
51 4.05323966463345E+17 1 0
52 8.10647932926689E+17 1 0
53 1.62129586585338E+18 1 0
54 3.24259173170676E+18 1 0
55 6.48518346341351E+18 1 0
56 1.2970366926827E+19 1 0
57 2.59407338536541E+19 1 0
58 5.18814677073081E+19 .999390827019096 0
59 1.03762935414616E+20 .999390827019096 0
60 2.07525870829232E+20 .994521895368273 0
30度,45度など,度を単位に切りのいい数に対する三角関数の値を求めたいときはこちらが推奨できます。
2進モードだと,2^53までの整数は正確に表現できます。


Re: 三角関数値が異常です SHIRAISHI Kazuo

2026/04/22 (Wed) 08:06:24

上のプログラムで,K=58以降でCOS(x)が1でない値になり,さらにその先まで計算していくとk=64以降で0になります。これは,十進BASICのバグ(?)です。
COS(x)=SIN(x+90)として計算しているのが原因で,x+90の計算が誤差を持つような範囲で正しい値が求まらなくなっています。

Re: 三角関数値が異常です SHIRAISHI Kazuo

2026/04/24 (Fri) 17:24:18

https://ja.wikipedia.org/wiki/ワイエルシュトラス関数
で,
COS(b^n*x*π)を正確に計算したいのであれば,b^n*xを2で割った余りをrとおくと,COS(b^n*x*π)=COS(r*π)
0≦r<2なので,COS(r*π)をCOS(r*PI)で近似してもさほど問題ない。


OPTION ARITHMETIC NATIVE
LET a=1/2
LET b=11
FUNCTION w(x)
LET t=0
LET n=0
FOR n=200 TO 0 STEP -1
LET r=MOD(b^n*x,2)
LET t=t+a^n*COS(r*PI)
NEXT n
LET w=t
END FUNCTION
SET POINT STYLE 1
SET WINDOW -2,2,-2,2
DRAW grid
FOR x=-2 TO 2 STEP 0.00001
PLOT LINES:x,w(x);
NEXT x
END

Re: 三角関数値が異常です SHIRAISHI Kazuo

2026/04/25 (Sat) 07:25:56

上掲のプログラムで,w(x)≒0付近の相対誤差ではなく,絶対誤差のみを要求するとき,FOR文の始値n=200は過大です。
COSの値は―1~1の範囲になるのでw(x)の和は公比a=1/2の等比級数の和で抑えられます。
たとえば,n=54に選べば,計算しない残余項の和は2^(-54)以下になります。
なお,n≦54であっても,nが少し大きな数だと,b^n*xはかなり大きな数になって誤差をはらみ,r=MOD(b^n*x,2)は多くの場合,0になります。
そのあたりまで考えて正確に計算したいのであれば,MOD(b^n*x,2)を正確に導き出す手法を編み出す必要があります。

Re: 三角関数値が異常です SHIRAISHI Kazuo

2026/04/25 (Sat) 09:45:10

MOD(b^n*x,2) = MOD((b^(n-1)*x)*b,2) = MOD(MOD(b^(n-1)*x,2)*b,2) を使えばよさそうです。

LET b=11
FOR x=-2 TO 2 STEP 2^(-10)
LET r=MOD(x,2)
FOR n=1 TO 60
LET r=MOD(r*b,2)
PRINT x,n,r
NEXT n
NEXT x
END

xに2進小数として切りのいい数を指定しないと,カオスになります。

Re: 三角関数値が異常です SHIRAISHI Kazuo

2026/05/03 (Sun) 08:36:57

上掲プログラムで,xに2進小数として切りのいい数を指定しないとカオスになるのは,2進モードのMOD関数が十分な精度を持たないのが影響していました。修正します。

Re: 三角関数値が異常です SHIRAISHI Kazuo

2026/05/16 (Sat) 09:10:26

ワイエルシュトラス関数のグラフを描くプログラムです。
グラフを描く目的ならさほど多くの項の計算は不要です。
2進倍精度で計算するのであれば,140行で求めているNmaxまで計算することが目安になります。

100 REM ワイエルシュトラス関数
110 OPTION ARITHMETIC NATIVE
120 LET a=0.5
130 LET b=13
140 LET Nmax=-54*LOG2(a)
150 FUNCTION w(x)
160 LET t=0
170 LET r=MOD(x,2)
180 FOR n=0 TO NMax
190 LET t=t+a^n*COS(r*PI)
200 LET r=MOD(r*b,2)
210 NEXT n
220 LET w=t
230 END FUNCTION
240 SET POINT STYLE 1
250 SET WINDOW -2,2,-2,2
260 DRAW GRID
270 FOR x=-2 TO 2 STEP 2^(-18)
280 PLOT POINTS:x,w(x)
290 NEXT x
300 END


https://ja.wikipedia.org/wiki/ワイエルシュトラス関数
にある画像は,a=0.5,b=3 程度で作成されたもののように思えます。

BASICAcc 1.2.3.0 ParactBASIC 2.1.5.0 SHIRAISHI Kazuo

2026/05/15 (Fri) 21:02:45

BASICAcc 1.2.3.0とParactBASIC 2.1.5.0で,Intel FPU環境で引数の絶対値が2^63以上だと三角関数が異常値をとる不具合を修正しました。
従来,FPCのsin, cosを直接利用する形に翻訳していたものを,別途用意したライブラリを使う形にするために,内部構造を変更しています。
関係ないところに変更の余波が及ぶ可能性もあるので,不具合に気付いた方は報告をお願いします。

微細構造定数と質量比3種 百瀬

2026/05/15 (Fri) 14:14:45

CODATA2022の不確かさ内の精度で物理定数を導出します。
数字パズルとして組合わせを見つける確率や情報圧縮の
観点から、結果を狙っての設計は不可能だと思いますが、
お詳しい方のご意見を頂けましたら幸いです。


LET u=1
LET r=u+2
LET a=r*(r-u)
LET b=2
LET nn=a+b-u
LET rel=a+b+r
LET ph=nn+b
LET h=rel+u+nn
LET n=r+rel+ph+h
LET c=2*n
LET p=4*ATN(1)
LET t=1-a/nn^2
LET Phi=n*r+rel+r/c+(rel-ph)/c^2+(18/(nn*p))*t/c^3+(4*p)*t/c^4
LET d1=r+ph+u
LET d2=h*(n-(r+u))
LET d3=d1*d2
LET d4=d2*(n-(r+u))*a*(rel-r)
LET P1=c*(h+r)-(ph+r)+(rel-ph)/d1-u/d2+(rel-ph)/d3-u/d4
LET P2=h*rel-r+(rel-u)/d1-u/d2+(r+u)/d3+(h-r-u)/d4
LET P3=n*(c-u)-ph+(rel-ph)/d1-(rel-ph)/d2+(r+u)/d3-(r*h)/d4
PRINT "Alpha^-1="; Phi
PRINT "Proton ="; P1
PRINT "Muon ="; P2
PRINT "Tau ="; P3
END

ガチャ - しばっち

2026/05/03 (Sun) 07:41:47

ガチャ(カブセルトイ)N種を全種揃えるまでにかかった回数

https://keisan.site/exec/system/1375851215#google_vignette
https://manabitimes.jp/math/1053


出現確率は全て同じとする。(シークレット等特別なものはここでは考慮していない)


! ガチャN種を全種揃えるまでにかかった回数
RANDOMIZE
LET TRUE=1
LET FALSE=0
LET N=6 ! ガチャ種類
LET ITER=300 ! 試行回数
DIM A(N),C(N*12)
FOR J=1 TO ITER
LET COUNT=0
MAT A=ZER
DO
LET COUNT=COUNT+1
LET K=INT(RND*N+1)
LET A(K)=A(K)+1
LET FL=TRUE
FOR I=1 TO N
IF A(I)=0 THEN LET FL=FALSE
NEXT I
LOOP UNTIL FL=TRUE
LET C(COUNT)=C(COUNT)+1
NEXT J
FOR I=N TO N*12
PRINT USING"###":I;
PRINT "回 :";REPEAT$("*",C(I));C(I);C(I)/ITER*100;"%"
LET S=S+I*C(I)
IF C(I)>0 AND SMIN=0 THEN LET SMIN=I
IF C(I)>V THEN
LET V=C(I)
LET MOST=I
END IF
NEXT I
FOR I=N*12 TO N STEP -1
IF C(I)>0 AND SMAX=0 THEN LET SMAX=I
NEXT I
PRINT "平均";S/ITER;"回"
PRINT "最低";SMIN;"回"
PRINT "最大";SMAX;"回"
PRINT "最頻値";MOST;"回"
END

下記結果は6種類の時、全てゲットするまでにかかった回数
300回試行した結果、最低6回(超ラッキー 1.33%)でゲットし、最大62回(超ついてない 0.33%)も費やした。
ガチャ1回300円とすると300円×6回で最低1800円。最大300円×62回で18600円もかかる


         実行結果


6回 :**** 4 1.33333333333333 %
7回 :************ 12 4 %
8回 :*************** 15 5 %
9回 :******************* 19 6.33333333333333 %
10回 :************************ 24 8 %
11回 :********************** 22 7.33333333333333 %
12回 :***************************** 29 9.66666666666667 %
13回 :**************** 16 5.33333333333333 %
14回 :*********************** 23 7.66666666666667 %
15回 :***************** 17 5.66666666666667 %
16回 :******************* 19 6.33333333333333 %
17回 :************** 14 4.66666666666667 %
18回 :******** 8 2.66666666666667 %
19回 :************* 13 4.33333333333333 %
20回 :*********** 11 3.66666666666667 %
21回 :******* 7 2.33333333333333 %
22回 :********* 9 3 %
23回 :** 2 .666666666666667 %
24回 :**** 4 1.33333333333333 %
25回 :** 2 .666666666666667 %
26回 :******* 7 2.33333333333333 %
27回 :** 2 .666666666666667 %
28回 :***** 5 1.66666666666667 %
29回 :** 2 .666666666666667 %
30回 : 0 0 %
31回 :**** 4 1.33333333333333 %
32回 :**** 4 1.33333333333333 %
33回 : 0 0 %
34回 :* 1 .333333333333333 %
35回 :* 1 .333333333333333 %
36回 : 0 0 %
37回 :* 1 .333333333333333 %
38回 : 0 0 %
39回 : 0 0 %
40回 :* 1 .333333333333333 %
41回 :* 1 .333333333333333 %
42回 : 0 0 %
43回 : 0 0 %
44回 : 0 0 %
45回 : 0 0 %
46回 : 0 0 %
47回 : 0 0 %
48回 : 0 0 %
49回 : 0 0 %
50回 : 0 0 %
51回 : 0 0 %
52回 : 0 0 %
53回 : 0 0 %
54回 : 0 0 %
55回 : 0 0 %
56回 : 0 0 %
57回 : 0 0 %
58回 : 0 0 %
59回 : 0 0 %
60回 : 0 0 %
61回 : 0 0 %
62回 :* 1 .333333333333333 %
63回 : 0 0 %
64回 : 0 0 %
65回 : 0 0 %
66回 : 0 0 %
67回 : 0 0 %
68回 : 0 0 %
69回 : 0 0 %
70回 : 0 0 %
71回 : 0 0 %
72回 : 0 0 %
平均 15.4633333333333 回
最低 6 回
最大 62 回
最頻値 12 回
----------------------------------------------------------------------------
! ガチャN種を全種揃えるまでにかかる期待値

SET WINDOW -3,50,-10,300
DRAW GRID(5,10)
FOR N=1 TO 50
LET S=0
FOR K=1 TO N
LET S=S+1/K
NEXT K
PLOT LINES:N,S*N;
NEXT N
END

Re: ガチャ - しばっち

2026/05/03 (Sun) 07:43:01

https://dskjal.com/statistics/chance-calculator-jp
https://mikami3345.cloudfree.jp/Probability/Probability.html

! スマホガチャ 当選率P%をN回ガチャ引いて1個以上当たる確率
!LET P=1/100 ! 当選率
!LET N=100 ! ガチャを引く回数
!PRINT (1-(1-P)^N)*100;"%"

SET WINDOW -10,150,-10,100
DRAW GRID(10,10)
LET P=1/100 ! 当選率
FOR N=0 TO 150 ! ガチャを引く回数
PLOT LINES:N,(1-(1-P)^N)*100;
NEXT N
END
-----------------------------------------------------------------------
上記のシュミレーションプログラム


RANDOMIZE
DIM GACHA(100)
INPUT PROMPT "当選確率 (%)(1-99) ":L
INPUT PROMPT "ガチャを引く回数 ":N
LET M=500 ! 試行回数
FOR I=1 TO L ! 100個のうちL個が当たり
LET GACHA(I)=1
NEXT I
FOR I=1 TO M
FOR J=1 TO 100 ! シャッフル
SWAP GACHA(J),GACHA(INT(RND*100+1))
NEXT J
LET FLG=0
FOR J=1 TO N
LET P=INT(RND*100+1) ! ガチャを引く
IF GACHA(P)=1 THEN ! 当たりを引いた
LET FLG=1
EXIT FOR
END IF
NEXT J
IF FLG=0 THEN LET C=C+1 ! 全部外れたらカウント
NEXT I
PRINT "当選確率";L;"%の時、";N;"回ガチャを引いて当たる確率";(M-C)/M*100;"%"
END

        実行結果


当選確率 (%)(1-99) 1
ガチャを引く回数 100
当選確率 1 %の時、 100 回ガチャを引いて当たる確率 62.2 %
-----------------------------------------------------------------------
当選確率L%の時、N回ガチャを引いて当たる回数の確率


OPTION BASE 0
RANDOMIZE
DIM GACHA(100),C(100)
INPUT PROMPT "当選確率 (%)(1-99) ":L ! L=1
INPUT PROMPT "ガチャを引く回数 ":N ! N=100
LET M=500 ! 試行回数
FOR I=1 TO L ! 100個のうちL個が当たり
LET GACHA(I)=1
NEXT I
FOR I=1 TO M
FOR J=1 TO 100 ! シャッフル
SWAP GACHA(J),GACHA(INT(RND*100+1))
NEXT J
LET HIT=0
FOR J=1 TO N
LET P=INT(RND*100+1) ! ガチャを引く
IF GACHA(P)=1 THEN ! 当たりを引いた
LET HIT=HIT+1
END IF
NEXT J
LET C(HIT)=C(HIT)+1
NEXT I
FOR I=1 TO 100
IF C(I)>0 THEN PRINT "当選確率";L;"%の時、";N;"回ガチャを引いて";I;"回当たる確率";C(I)/M*100;"%"
NEXT I
END

          実行結果


当選確率 (%)(1-99) 1
ガチャを引く回数 100
当選確率 1 %の時、 100 回ガチャを引いて 1 回当たる確率 34.2 %
当選確率 1 %の時、 100 回ガチャを引いて 2 回当たる確率 21.4 %
当選確率 1 %の時、 100 回ガチャを引いて 3 回当たる確率 5.8 %
当選確率 1 %の時、 100 回ガチャを引いて 4 回当たる確率 1.4 %
当選確率 1 %の時、 100 回ガチャを引いて 5 回当たる確率 .2 %
当選確率 1 %の時、 100 回ガチャを引いて 9 回当たる確率 .2 %
-----------------------------------------------------------------------
入手確率 X%を達成するために必要な試行回数


LET P=1/100 ! 当選率
LET N=99/100 ! 入手確率
FOR X=1 TO 10000
IF 1-(1-P)^X>N THEN EXIT FOR
NEXT X
PRINT "当選確率";P*100;"% 入手確率";N*100;"% 達するために必要な試行回数";X;"回"
END
-----------------------------------------------------------------------
N回ガチャ引いても当たらない確率


LET N=100 ! 試行回数
LET P=.5/100 ! 当選確率
PRINT "当選確率";P*100;"%の時、";N;"回ガチャを引いても当たらない確率";(1-P)^N*100;"%"
END
-----------------------------------------------------------------------
当たりが2個ある場合の確率

但し、当選確率1%という時、合わせての合計確率1/200+1/200で1/100つまり計1%と
それぞれが1%、つまり1/100+1/100で計2%となる場合の2通りがある。


RANDOMIZE
DIM GACHA(200)
LET M=500 ! 試行回数
LET MODE=1
SELECT CASE MODE
CASE 1
INPUT PROMPT "合わせての当選確率 (%)(1-99) ":L
FOR I=1 TO L ! 200個のうちL個が当たり L/200+L/200=L/100(L%)
LET C=C+1
LET GACHA(C)=1
LET C=C+1
LET GACHA(C)=2
NEXT I
CASE 2
INPUT PROMPT "個別の当選確率 (%)(1-99) ":L
FOR I=1 TO L*2 ! 200個のうち2*L個が当たり L/100(L%)+L/100(L%)=2*L/100 (2L%)
LET C=C+1
LET GACHA(C)=1
LET C=C+1
LET GACHA(C)=2
NEXT I
!CASE 3
! INPUT PROMPT "1,2合わせての当選確率 (%)(1-99) ":L1,L2
! FOR I=1 TO L1 ! 200個のうちL1個とL2個が当たり L1/200+L2/200
! LET C=C+1
! LET GACHA(C)=1
! NEXT I
! FOR I=1 TO L2
! LET C=C+1
! LET GACHA(C)=2
! NEXT I
!CASE 4
! INPUT PROMPT "1,2個別の当選確率 (%)(1-99) ":L1,L2
! FOR I=1 TO L1*2 ! 200個のうちL1個とL2個が当たり L1/100+L2/100
! LET C=C+1
! LET GACHA(C)=1
! NEXT I
! FOR I=1 TO L2*2
! LET C=C+1
! LET GACHA(C)=2
! NEXT I
END SELECT
INPUT PROMPT "ガチャを引く回数 ":N
FOR I=1 TO M
FOR J=1 TO 200 ! シャッフル
SWAP GACHA(J),GACHA(INT(RND*200+1))
NEXT J
LET HIT1=0
LET HIT2=0
FOR J=1 TO N
LET P=INT(RND*200+1) ! ガチャを引く
IF GACHA(P)=1 THEN LET HIT1=HIT1+1
IF GACHA(P)=2 THEN LET HIT2=HIT2+1
NEXT J
IF (HIT1>0 AND HIT2=0) OR (HIT1=0 AND HIT2>0) THEN LET EITHER=EITHER+1
IF HIT1>0 AND HIT2>0 THEN LET BOTH=BOTH+1
IF HIT1=0 AND HIT2=0 THEN LET MISS=MISS+1
NEXT I
IF L>0 THEN
PRINT "当選確率";L;"%の時、";N;"回ガチャを引いてどちらかが当たる確率";EITHER/M*100;"%"
PRINT "当選確率";L;"%の時、";N;"回ガチャを引いてどちらも当たる確率";BOTH/M*100;"%"
PRINT "当選確率";L;"%の時、";N;"回ガチャを引いてどちらも外れる確率";MISS/M*100;"%"
ELSE
PRINT "当選確率";L1;"%、";L2;"%の時、";N;"回ガチャを引いてどちらかが当たる確率";EITHER/M*100;"%"
PRINT "当選確率";L1;"%、";L2;"%の時、";N;"回ガチャを引いてどちらも当たる確率";BOTH/M*100;"%"
PRINT "当選確率";L1;"%、";L2;"%の時、";N;"回ガチャを引いてどちらも外れる確率";MISS/M*100;"%"
END IF
END

         実行結果


合わせての当選確率 (%)(1-99) 1
ガチャを引く回数 100
当選確率 1 %の時、 100 回ガチャを引いてどちらかが当たる確率 46.2 %
当選確率 1 %の時、 100 回ガチャを引いてどちらも当たる確率 15 %
当選確率 1 %の時、 100 回ガチャを引いてどちらも外れる確率 38.8 %

-----------------------------------------------------------------------
当たりが3個ある場合の確率

RANDOMIZE
DIM GACHA(300)
LET M=500 ! 試行回数
LET MODE=1
SELECT CASE MODE
CASE 1
INPUT PROMPT "合わせての当選確率 (%)(1-99) ":L
FOR I=1 TO L ! 300個のうちL個が当たり L/300+L/300+L/300=L/100(L%)
LET C=C+1
LET GACHA(C)=1
LET C=C+1
LET GACHA(C)=2
LET C=C+1
LET GACHA(C)=3
NEXT I
CASE 2
INPUT PROMPT "個別の当選確率 (%)(1-99) ":L
FOR I=1 TO L*3 ! 300個のうち3*L個が当たり L/100(L%)+L/100(L%)+L/100(L%)=L/50 (3L%)
LET C=C+1
LET GACHA(C)=1
LET C=C+1
LET GACHA(C)=2
LET C=C+1
LET GACHA(C)=3
NEXT I
!CASE 3
! INPUT PROMPT "1,2,3合わせての当選確率 (%)(1-99) ":L1,L2,L3
! FOR I=1 TO L1 ! 300個のうちL個が当たり L1/300+L2/300+L3/300
! LET C=C+1
! LET GACHA(C)=1
! NEXT I
! FOR I=1 TO L2
! LET C=C+1
! LET GACHA(C)=2
! NEXT I
! FOR I=1 TO L3
! LET C=C+1
! LET GACHA(C)=3
! NEXT I
!CASE 4
! INPUT PROMPT "1,2,3個別の当選確率 (%)(1-99) ":L1,L2,L3
! FOR I=1 TO L1*3 ! 300個のうちL個が当たり L1/100+L2/100+L3/100
! LET C=C+1
! LET GACHA(C)=1
! NEXT I
! FOR I=1 TO L2*3
! LET C=C+1
! LET GACHA(C)=2
! NEXT I
! FOR I=1 TO L3*3
! LET C=C+1
! LET GACHA(C)=3
! NEXT I
END SELECT
INPUT PROMPT "ガチャを引く回数 ":N
FOR I=1 TO M
FOR J=1 TO 300 ! シャッフル
SWAP GACHA(J),GACHA(INT(RND*300+1))
NEXT J
LET HIT1=0
LET HIT2=0
LET HIT3=0
FOR J=1 TO N
LET P=INT(RND*300+1) ! ガチャを引く
IF GACHA(P)=1 THEN LET HIT1=HIT1+1
IF GACHA(P)=2 THEN LET HIT2=HIT2+1
IF GACHA(P)=3 THEN LET HIT3=HIT3+1
NEXT J
IF HIT1>0 AND HIT2=0 AND HIT3=0 THEN LET EITHER1=EITHER1+1
IF HIT1=0 AND HIT2>0 AND HIT3=0 THEN LET EITHER1=EITHER1+1
IF HIT1=0 AND HIT2=0 AND HIT3>0 THEN LET EITHER1=EITHER1+1

IF HIT1>0 AND HIT2>0 AND HIT3=0 THEN LET EITHER2=EITHER2+1 ! 1,2
IF HIT1>0 AND HIT3>0 AND HIT2=0 THEN LET EITHER2=EITHER2+1 ! 1,3
IF HIT2>0 AND HIT3>0 AND HIT1=0 THEN LET EITHER2=EITHER2+1 ! 2,3

IF HIT1>0 AND HIT2>0 AND HIT3>0 THEN LET ALL=ALL+1
IF HIT1=0 AND HIT2=0 AND HIT3=0 THEN LET MISS=MISS+1
NEXT I
IF L>0 THEN
PRINT "当選確率";L;"%の時、";N;"回ガチャを引いてどれか1種類が当たる確率";EITHER1/M*100;"%"
PRINT "当選確率";L;"%の時、";N;"回ガチャを引いてどれか2種類が当たる確率";EITHER2/M*100;"%"
PRINT "当選確率";L;"%の時、";N;"回ガチャを引いて全種類が当たる確率";ALL/M*100;"%"
PRINT "当選確率";L;"%の時、";N;"回ガチャを引いてどれも外れる確率";MISS/M*100;"%"
ELSE
PRINT "当選確率";L1;"%、";L2;"%、";L3;"%の時、";N;"回ガチャを引いてどれか1種類が当たる確率";EITHER1/M*100;"%"
PRINT "当選確率";L1;"%、";L2;"%、";L3;"%の時、";N;"回ガチャを引いてどれか2種類が当たる確率";EITHER2/M*100;"%"
PRINT "当選確率";L1;"%、";L2;"%、";L3;"%の時、";N;"回ガチャを引いて全種類が当たる確率";ALL/M*100;"%"
PRINT "当選確率";L1;"%、";L2;"%、";L3;"%の時、";N;"回ガチャを引いてどれも外れる確率";MISS/M*100;"%"
END IF
END

        実行結果


合わせての当選確率 (%)(1-99) 1
ガチャを引く回数 100
当選確率 1 %の時、 100 回ガチャを引いてどれか1種類が当たる確率 44.4 %
当選確率 1 %の時、 100 回ガチャを引いてどれか2種類が当たる確率 17.4 %
当選確率 1 %の時、 100 回ガチャを引いて全種類が当たる確率 2.2 %
当選確率 1 %の時、 100 回ガチャを引いてどれも外れる確率 36 %
-----------------------------------------------------------------------
当たりが複数の場合


OPTION BASE 0
RANDOMIZE
INPUT PROMPT "当たりの種類 ":K
INPUT PROMPT "ガチャを引く回数 ":N
DIM GACHA(100*K),C(K,N),HIT(K),LL(K)
LET M=500 ! 試行回数
LET MODE=1
SELECT CASE MODE
CASE 1
FOR J=1 TO K
INPUT PROMPT STR$(J)&"の当選確率 (%)(1-99) ":LL(J)
NEXT J
FOR I=1 TO K
FOR J=1 TO LL(I)
LET CC=CC+1
LET GACHA(CC)=I
NEXT J
NEXT I
CASE 2
FOR J=1 TO K
INPUT PROMPT STR$(J)&"の当選確率 (%)(1-99) ":LL(J)
NEXT J
FOR I=1 TO K
FOR J=1 TO LL(I)*K
LET CC=CC+1
LET GACHA(CC)=I
NEXT J
NEXT I
END SELECT
FOR I=1 TO M
FOR J=1 TO 100*K ! シャッフル
SWAP GACHA(J),GACHA(INT(RND*100*K+1))
NEXT J
MAT HIT=ZER
FOR J=1 TO N
LET P=INT(RND*100*K+1) ! ガチャを引く
FOR F=1 TO K
IF GACHA(P)=F THEN
LET HIT(F)=HIT(F)+1 ! F種目の当たり引いた
EXIT FOR
END IF
NEXT F
NEXT J
FOR F=1 TO K
LET C(F,HIT(F))=C(F,HIT(F))+1
NEXT F
NEXT I
FOR I=1 TO N
FOR F=1 TO K
IF C(F,I)>0 THEN
PRINT "当選確率";LL(F);"%の時、";N;"回ガチャを引いて";F;"種目が";I;"回当たる確率";C(F,I)/M*100;"%"
END IF
NEXT F
IF C(K,I)>0 THEN PRINT
NEXT I
END

            実行結果

当たりの種類 3
ガチャを引く回数 100
1の当選確率 (%)(1-99) 1
2の当選確率 (%)(1-99) 2
3の当選確率 (%)(1-99) 3
当選確率 1 %の時、 100 回ガチャを引いて 1 種目が 1 回当たる確率 23.8 %
当選確率 2 %の時、 100 回ガチャを引いて 2 種目が 1 回当たる確率 32.4 %
当選確率 3 %の時、 100 回ガチャを引いて 3 種目が 1 回当たる確率 38 %

当選確率 1 %の時、 100 回ガチャを引いて 1 種目が 2 回当たる確率 4 %
当選確率 2 %の時、 100 回ガチャを引いて 2 種目が 2 回当たる確率 11.8 %
当選確率 3 %の時、 100 回ガチャを引いて 3 種目が 2 回当たる確率 17.2 %

当選確率 2 %の時、 100 回ガチャを引いて 2 種目が 3 回当たる確率 2.6 %
当選確率 3 %の時、 100 回ガチャを引いて 3 種目が 3 回当たる確率 7 %

当選確率 3 %の時、 100 回ガチャを引いて 3 種目が 4 回当たる確率 1.4 %

当選確率 3 %の時、 100 回ガチャを引いて 3 種目が 5 回当たる確率 .6 %
-----------------------------------------------------------------------
これ以下より当たりがK種で内2つ、3つ、4つが当たりの場合のプログラムを挙げているが
当たり判定を微妙に変えているので注意すること

当たりがK種ある場合の内、少なくとも2つが当たる確率を個別に求める



A,B,Cの3種類当たりがあるとして(A>0 を当たり、A=0をハズレとする)

少なくともAかBが当たり A>0 OR B>0
少なくともAとBが当たり A>0 AND B>0
AかBのみが当たり (A>0 OR B>0) AND C=0
AとBのみが当たり A>0 AND B>0 AND C=0



また、IF GACHA(P)=JJ THEN LET HIT(JJ)=HIT(JJ)+1 として
当たる確率を求めているが

IF GACHA(P)<>JJ THEN LET MISS(JJ)=MISS(JJ)+1 と変更すれば
外れの確率を求めることもできる


RANDOMIZE
INPUT PROMPT "当たりの種類":K
DIM GACHA(100*K),HIT(K),EITHER(DEFARRAY2(K,K)),LL(K)
LET M=500 ! 試行回数
LET MODE=3
SELECT CASE MODE
!CASE 1
! INPUT PROMPT "合わせての当選確率 (%)(1-99) ":L
! FOR I=1 TO L
! FOR J=1 TO K
! LET C=C+1
! LET GACHA(C)=J
! NEXT J
! NEXT I
!CASE 2
! INPUT PROMPT "個別の当選確率 (%)(1-99) ":L
! FOR I=1 TO L*K
! FOR J=1 TO K
! LET C=C+1
! LET GACHA(C)=J
! NEXT J
! NEXT I
CASE 3
FOR J=1 TO K
INPUT PROMPT STR$(J)&"の当選確率 (%)(1-99) ":LL(J)
NEXT J
FOR I=1 TO K
FOR J=1 TO LL(I)
LET C=C+1
LET GACHA(C)=I
NEXT J
NEXT I
CASE 4
FOR J=1 TO K
INPUT PROMPT STR$(J)&"の当選確率 (%)(1-99) ":LL(J)
NEXT J
FOR I=1 TO K
FOR J=1 TO LL(I)*K
LET C=C+1
LET GACHA(C)=I
NEXT J
NEXT I
END SELECT
INPUT PROMPT "ガチャを引く回数 ":N
FOR I=1 TO M
FOR J=1 TO 100*K ! シャッフル
SWAP GACHA(J),GACHA(INT(RND*100*K+1))
NEXT J
MAT HIT=ZER
FOR J=1 TO N
LET P=INT(RND*100*K+1) ! ガチャを引く
FOR JJ=1 TO K
IF GACHA(P)=JJ THEN LET HIT(JJ)=HIT(JJ)+1 ! 当たりなら
NEXT JJ
NEXT J
FOR J1=1 TO K-1
FOR J2=J1+1 TO K
IF HIT(J1)>0 OR HIT(J2)>0 THEN
LET EITHER(ARRAY2(J1,J2))=EITHER(ARRAY2(J1,J2))+1
END IF
NEXT J2
NEXT J1
NEXT I
FOR J1=1 TO K-1
FOR J2=J1+1 TO K
PRINT N;"回ガチャを引いて少なくとも";J1;"か";J2;"が当たる確率";EITHER(ARRAY2(J1,J2))/M*100;"%"
NEXT J2
NEXT J1

FUNCTION DEFARRAY2(AMAX,BMAX)
LET MAX1=AMAX
LET MAX2=BMAX
LET DEFARRAY2=MAX2*MAX1
END FUNCTION

FUNCTION ARRAY2(X,Y)
LET X=INT(X)
LET Y=INT(Y)
IF X>MAX1 THEN LET X=MAX1
IF Y>MAX2 THEN LET Y=MAX2
IF X<1 THEN LET X=1
IF Y<1 THEN LET Y=1
LET SUM= MAX1*(Y-1)
LET SUM=SUM+X
LET ARRAY2=SUM
END FUNCTION
END

          実行結果


当たりの種類3
1の当選確率 (%)(1-99) 1
2の当選確率 (%)(1-99) 2
3の当選確率 (%)(1-99) 3
ガチャを引く回数 100
100 回ガチャを引いて少なくとも 1 か 2 が当たる確率 63.2 %
100 回ガチャを引いて少なくとも 1 か 3 が当たる確率 76 %
100 回ガチャを引いて少なくとも 2 か 3 が当たる確率 81.2 %
-----------------------------------------------------------------------
当たりがK種ある場合の内3つのみが当たる確率を個別に求める

RANDOMIZE
DO
INPUT PROMPT "当たりの種類":K ! K>=4
LOOP WHILE K<4
DIM GACHA(100*K),HIT(K),EITHER(DEFARRAY3(K,K,K)),LL(K)
LET M=500 ! 試行回数
LET MODE=4
SELECT CASE MODE
!CASE 1
! INPUT PROMPT "合わせての当選確率 (%)(1-99) ":L
! FOR I=1 TO L
! FOR J=1 TO K
! LET C=C+1
! LET GACHA(C)=J
! NEXT J
! NEXT I
!CASE 2
! INPUT PROMPT "個別の当選確率 (%)(1-99) ":L
! FOR I=1 TO L*K
! FOR J=1 TO K
! LET C=C+1
! LET GACHA(C)=J
! NEXT J
! NEXT I
CASE 3
FOR J=1 TO K
INPUT PROMPT STR$(J)&"の当選確率 (%)(1-99) ":LL(J)
NEXT J
FOR I=1 TO K
FOR J=1 TO LL(I)
LET C=C+1
LET GACHA(C)=I
NEXT J
NEXT I
CASE 4
FOR J=1 TO K
INPUT PROMPT STR$(J)&"の当選確率 (%)(1-99) ":LL(J)
NEXT J
FOR I=1 TO K
FOR J=1 TO LL(I)*K
LET C=C+1
LET GACHA(C)=I
NEXT J
NEXT I
END SELECT
INPUT PROMPT "ガチャを引く回数 ":N
FOR I=1 TO M
FOR J=1 TO 100*K ! シャッフル
SWAP GACHA(J),GACHA(INT(RND*100*K+1))
NEXT J
MAT HIT=ZER
FOR J=1 TO N
LET P=INT(RND*100*K+1) ! ガチャを引く
FOR JJ=1 TO K
IF GACHA(P)=JJ THEN LET HIT(JJ)=HIT(JJ)+1 ! 当たりなら
NEXT JJ
NEXT J
FOR J1=1 TO K-2
FOR J2=J1+1 TO K-1
FOR J3=J2+1 TO K
IF HIT(J1)>0 AND HIT(J2)>0 AND HIT(J3)>0 THEN
LET FLG=0
FOR JJ=1 TO K
IF J1<>JJ AND J2<>JJ AND J3<>JJ AND HIT(JJ)<>0 THEN LET FLG=1
NEXT JJ
IF FLG=0 THEN LET EITHER(ARRAY3(J1,J2,J3))=EITHER(ARRAY3(J1,J2,J3))+1
END IF
NEXT J3
NEXT J2
NEXT J1
NEXT I
FOR J1=1 TO K-2
FOR J2=J1+1 TO K-1
FOR J3=J2+1 TO K
PRINT N;"回ガチャを引いて";J1;"と";J2;"と";J3;"のみが当たる確率";EITHER(ARRAY3(J1,J2,J3))/M*100;"%"
NEXT J3
NEXT J2
NEXT J1

FUNCTION DEFARRAY3(AMAX,BMAX,CMAX)
LET MAX1=AMAX
LET MAX2=BMAX
LET MAX3=CMAX
LET DEFARRAY3=MAX3*MAX2*MAX1
END FUNCTION

FUNCTION ARRAY3(X,Y,Z)
LET X=INT(X)
LET Y=INT(Y)
LET Z=INT(Z)
IF X>MAX1 THEN LET X=MAX1
IF Y>MAX2 THEN LET Y=MAX2
IF Z>MAX3 THEN LET Z=MAX3
IF X<1 THEN LET X=1
IF Y<1 THEN LET Y=1
IF Z<1 THEN LET Z=1
LET SUM= MAX2*MAX1*(Z-1)
LET SUM=SUM+MAX1*(Y-1)
LET SUM=SUM+X
LET ARRAY3=SUM
END FUNCTION
END

         実行結果


当たりの種類6
1の当選確率 (%)(1-99) 1
2の当選確率 (%)(1-99) 2
3の当選確率 (%)(1-99) 3
4の当選確率 (%)(1-99) 4
5の当選確率 (%)(1-99) 5
6の当選確率 (%)(1-99) 6
ガチャを引く回数 100
100 回ガチャを引いて 1 と 2 と 3 のみが当たる確率 0 %
100 回ガチャを引いて 1 と 2 と 4 のみが当たる確率 0 %
100 回ガチャを引いて 1 と 2 と 5 のみが当たる確率 0 %
100 回ガチャを引いて 1 と 2 と 6 のみが当たる確率 0 %
100 回ガチャを引いて 1 と 3 と 4 のみが当たる確率 0 %
100 回ガチャを引いて 1 と 3 と 5 のみが当たる確率 0 %
100 回ガチャを引いて 1 と 3 と 6 のみが当たる確率 0 %
100 回ガチャを引いて 1 と 4 と 5 のみが当たる確率 0 %
100 回ガチャを引いて 1 と 4 と 6 のみが当たる確率 0 %
100 回ガチャを引いて 1 と 5 と 6 のみが当たる確率 0 %
100 回ガチャを引いて 2 と 3 と 4 のみが当たる確率 0 %
100 回ガチャを引いて 2 と 3 と 5 のみが当たる確率 0 %
100 回ガチャを引いて 2 と 3 と 6 のみが当たる確率 0 %
100 回ガチャを引いて 2 と 4 と 5 のみが当たる確率 0 %
100 回ガチャを引いて 2 と 4 と 6 のみが当たる確率 0 %
100 回ガチャを引いて 2 と 5 と 6 のみが当たる確率 0 %
100 回ガチャを引いて 3 と 4 と 5 のみが当たる確率 .2 %
100 回ガチャを引いて 3 と 4 と 6 のみが当たる確率 0 %
100 回ガチャを引いて 3 と 5 と 6 のみが当たる確率 0 %
100 回ガチャを引いて 4 と 5 と 6 のみが当たる確率 .2 %
-----------------------------------------------------------------------
当たりがK種ある場合の内4つが当たる確率を個別に求める


RANDOMIZE
DO
INPUT PROMPT "当たりの種類":K ! K>=5
LOOP WHILE K<5
DIM GACHA(100*K),HIT(K),EITHER(DEFARRAY4(K,K,K,K)),LL(K)
LET M=500 ! 試行回数
LET MODE=4
SELECT CASE MODE
!CASE 1
! INPUT PROMPT "合わせての当選確率 (%)(1-99) ":L
! FOR I=1 TO L
! FOR J=1 TO K
! LET C=C+1
! LET GACHA(C)=J
! NEXT J
! NEXT I
!CASE 2
! INPUT PROMPT "個別の当選確率 (%)(1-99) ":L
! FOR I=1 TO L*K
! FOR J=1 TO K
! LET C=C+1
! LET GACHA(C)=J
! NEXT J
! NEXT I
CASE 3
FOR J=1 TO K
INPUT PROMPT STR$(J)&"の当選確率 (%)(1-99) ":LL(J)
NEXT J
FOR I=1 TO K
FOR J=1 TO LL(I)
LET C=C+1
LET GACHA(C)=I
NEXT J
NEXT I
CASE 4
FOR J=1 TO K
INPUT PROMPT STR$(J)&"の当選確率 (%)(1-99) ":LL(J)
NEXT J
FOR I=1 TO K
FOR J=1 TO LL(I)*K
LET C=C+1
LET GACHA(C)=I
NEXT J
NEXT I
END SELECT
INPUT PROMPT "ガチャを引く回数 ":N
FOR I=1 TO M
FOR J=1 TO 100*K ! シャッフル
SWAP GACHA(J),GACHA(INT(RND*100*K+1))
NEXT J
MAT HIT=ZER
FOR J=1 TO N
LET P=INT(RND*100*K+1) ! ガチャを引く
FOR JJ=1 TO K
IF GACHA(P)=JJ THEN LET HIT(JJ)=HIT(JJ)+1 ! 当たりなら
NEXT JJ
NEXT J
FOR J1=1 TO K-3
FOR J2=J1+1 TO K-2
FOR J3=J2+1 TO K-1
FOR J4=J3+1 TO K
IF HIT(J1)>0 OR HIT(J2)>0 OR HIT(J3)>0 OR HIT(J4)>0 THEN
LET FLG=0
FOR JJ=1 TO K
IF J1<>JJ AND J2<>JJ AND J3<>JJ AND J4<>JJ AND HIT(JJ)<>0 THEN LET FLG=1
NEXT JJ
IF FLG=0 THEN LET EITHER(ARRAY4(J1,J2,J3,J4))=EITHER(ARRAY4(J1,J2,J3,J4))+1
END IF
NEXT J4
NEXT J3
NEXT J2
NEXT J1
NEXT I
FOR J1=1 TO K-3
FOR J2=J1+1 TO K-2
FOR J3=J2+1 TO K-1
FOR J4=J3+1 TO K
PRINT N;"回ガチャを引いて";J1;"か";J2;"か";J3;"か";J4;"のみが当たる確率";EITHER(ARRAY4(J1,J2,J3,J4))/M*100;"%"
NEXT J4
NEXT J3
NEXT J2
NEXT J1

FUNCTION DEFARRAY4(AMAX,BMAX,CMAX,DMAX)
LET MAX1=AMAX
LET MAX2=BMAX
LET MAX3=CMAX
LET MAX4=DMAX
LET DEFARRAY4=MAX4*MAX3*MAX2*MAX1
END FUNCTION

FUNCTION ARRAY4(X,Y,Z,W)
LET X=INT(X)
LET Y=INT(Y)
LET Z=INT(Z)
LET W=INT(W)
IF X>MAX1 THEN LET X=MAX1
IF Y>MAX2 THEN LET Y=MAX2
IF Z>MAX3 THEN LET Z=MAX3
IF W>MAX4 THEN LET W=MAX4
IF X<1 THEN LET X=1
IF Y<1 THEN LET Y=1
IF Z<1 THEN LET Z=1
IF W<1 THEN LET W=1
LET SUM= MAX3*MAX2*MAX1*(W-1)
LET SUM=SUM+MAX2*MAX1*(Z-1)
LET SUM=SUM+MAX1*(Y-1)
LET SUM=SUM+X
LET ARRAY4=SUM
END FUNCTION
END

         実行結果

当たりの種類5
1の当選確率 (%)(1-99) 1
2の当選確率 (%)(1-99) 2
3の当選確率 (%)(1-99) 3
4の当選確率 (%)(1-99) 4
5の当選確率 (%)(1-99) 5
ガチャを引く回数 100
100 回ガチャを引いて 1 か 2 か 3 か 4 のみが当たる確率 .6 %
100 回ガチャを引いて 1 か 2 か 3 か 5 のみが当たる確率 1.4 %
100 回ガチャを引いて 1 か 2 か 4 か 5 のみが当たる確率 5.2 %
100 回ガチャを引いて 1 か 3 か 4 か 5 のみが当たる確率 12.6 %
100 回ガチャを引いて 2 か 3 か 4 か 5 のみが当たる確率 33 %

実行ファイルの作り方 - 永野護

2026/05/02 (Sat) 03:02:53

実行ファイルの作り方を教えてください。

Re: 実行ファイルの作り方 - SHIRAISHI Kazuo

2026/05/02 (Sat) 07:46:01

2進モード,複素数モードで動くプログラムは,たいていの場合,BASIC Accelerator で実行ファイル化できます。
https://decimalbasic.web.fc2.com/BASICAccJa.htm
実行ファイルは,outoutフォルダにNoName.exeとして生成されるので,適宜,名称を変更してください。
特別なDLLに依存せずに動作します。

Re: 実行ファイルの作り方 - 永野護

2026/05/02 (Sat) 08:20:14

ありがとうございました。

ver7881がダウンロードできません - やまだ

2026/04/22 (Wed) 10:25:44

windowsアーカイブ版のBASIC7881.zipをダウンロードすると、ver.4.4.23 2006.4.16がダウンロードされてしまいます。こちらの操作が変でなのでしょうか?

Re: ver7881がダウンロードできません SHIRAISHI Kazuo

2026/04/22 (Wed) 11:42:08

ご報告ありがとうございました。
BASIC7881.zipはBASICW95のアーカイブになっていました。お手数をお掛けしますが,再度,ダウンロードをお願いします。

じゃんけん - しばっち

2026/04/12 (Sun) 07:44:49

N人でのじゃんけんが終了する(残り一人になる)までの回数


RANDOMIZE
INPUT PROMPT "人数=":N
DIM A(N),J$(0 TO 2),P(0 TO 2)
LET J$(0)="グー"
LET J$(1)="チョッキ"
LET J$(2)="パー"
DO
LET COUNT=COUNT+1
MAT A=ZER
MAT P=ZER
! PRINT COUNT;"回"
FOR I=1 TO N
LET A(I)=INT(RND*3)
! PRINT J$(A(I)),
NEXT I
! PRINT
FOR I=1 TO N
LET P(A(I))=P(A(I))+1
NEXT I
IF P(0)>0 AND P(1)>0 AND P(2)=0 THEN LET N=P(0) ! グーの勝ち
IF P(0)>0 AND P(1)=0 AND P(2)>0 THEN LET N=P(2) ! パーの勝ち
IF P(0)=0 AND P(1)>0 AND P(2)>0 THEN LET N=P(1) ! チョッキの勝ち
LOOP UNTIL N=1
PRINT COUNT;"回のジャンケンで残り一人になりました"
END
---------------------------------------------------------------------------
RANDOMIZE
DIM A(30),P(0 TO 2)
LET T=30 ! 試行回数
FOR NN=2 TO 30 ! 人数
LET SUM=0
FOR K=1 TO T
LET N=NN
LET COUNT=0
DO
LET COUNT=COUNT+1
MAT A=ZER
MAT P=ZER
FOR I=1 TO N
LET A(I)=INT(RND*3)
NEXT I
FOR I=1 TO N
LET P(A(I))=P(A(I))+1
NEXT I
IF P(0)>0 AND P(1)>0 AND P(2)=0 THEN LET N=P(0) ! グーの勝ち
IF P(0)>0 AND P(1)=0 AND P(2)>0 THEN LET N=P(2) ! パーの勝ち
IF P(0)=0 AND P(1)>0 AND P(2)>0 THEN LET N=P(1) ! チョキの勝ち
LOOP UNTIL N=1
LET SUM=SUM+COUNT
NEXT K
PRINT NN;"人の時";SUM/T;"回"
NEXT NN
END

30回試行させてじゃんけんで一人になるまでの平均回数を求めてみた。

        実行結果

2 人の時 1.7 回
3 人の時 2.23333333333333 回
4 人の時 2.93333333333333 回
5 人の時 4.26666666666667 回
6 人の時 7.1 回
7 人の時 9.3 回
8 人の時 11.2333333333333 回
9 人の時 19.2333333333333 回
10 人の時 27.5333333333333 回
11 人の時 37.0333333333333 回
12 人の時 51.0333333333333 回
13 人の時 54.3333333333333 回
14 人の時 74.4666666666667 回
15 人の時 134 回
16 人の時 274.1 回
17 人の時 354.166666666667 回
18 人の時 527.233333333333 回
19 人の時 735.066666666667 回
20 人の時 1025.76666666667 回
21 人の時 1900.8 回
22 人の時 2451.56666666667 回
23 人の時 3752.83333333333 回
24 人の時 5382.76666666667 回
25 人の時 9291.76666666667 回
26 人の時 12405.2666666667 回
27 人の時 19177.9 回
28 人の時 28564.6333333333 回
29 人の時 33776.7333333333 回
30 人の時 81116.3 回

Re: じゃんけん - しばっち

2026/04/12 (Sun) 07:46:03

じゃんけんをして一人だけが勝ち抜けするまでの回数
但し、途中で勝っても抜けず一人だけが勝つ迄の回数


RANDOMIZE
INPUT PROMPT "人数=":N
DIM A(N),J$(0 TO 2),P(0 TO 2)
LET J$(0)="グー"
LET J$(1)="チョキ"
LET J$(2)="パー"
DO
LET COUNT=COUNT+1
MAT A=ZER
MAT P=ZER
! PRINT COUNT;"回"
FOR I=1 TO N
LET A(I)=INT(RND*3)
! PRINT J$(A(I)),
NEXT I
! PRINT
FOR I=1 TO N
LET P(A(I))=P(A(I))+1
NEXT I
IF P(0)=1 AND P(1)>0 AND P(2)=0 THEN EXIT DO ! グーの一人勝ち
IF P(0)>0 AND P(1)=0 AND P(2)=1 THEN EXIT DO ! パーの一人勝ち
IF P(0)=0 AND P(1)=1 AND P(2)>0 THEN EXIT DO ! チョキの一人勝ち
LOOP
PRINT COUNT;"回のジャンケンで一人勝ちになりました"
END
-------------------------------------------------------------------
20回試行して一人勝ちする迄の平均回数を求めてみた。


RANDOMIZE
DIM A(15),P(0 TO 2)
LET L=20
FOR NN=2 TO 15 ! 人数
LET SUM=0
FOR K=1 TO L ! 試行回数
LET N=NN
LET COUNT=0
DO
LET COUNT=COUNT+1
MAT P=ZER
FOR I=1 TO N
LET A(I)=INT(RND*3)
NEXT I
FOR I=1 TO N
LET P(A(I))=P(A(I))+1
NEXT I
IF P(0)=1 AND P(1)>0 AND P(2)=0 THEN EXIT DO ! グーの一人勝ち
IF P(0)>0 AND P(1)=0 AND P(2)=1 THEN EXIT DO ! パーの一人勝ち
IF P(0)=0 AND P(1)=1 AND P(2)>0 THEN EXIT DO ! チョキの一人勝ち
LOOP
LET SUM=SUM+COUNT
NEXT K
PRINT NN;"人の時";SUM/L;"回のジャンケンで一人勝ちになりました"
NEXT NN
END

         実行結果


2 人の時 1.7 回のジャンケンで一人勝ちになりました
3 人の時 2.4 回のジャンケンで一人勝ちになりました
4 人の時 3.95 回のジャンケンで一人勝ちになりました
5 人の時 14.65 回のジャンケンで一人勝ちになりました
6 人の時 43.25 回のジャンケンで一人勝ちになりました
7 人の時 107.45 回のジャンケンで一人勝ちになりました
8 人の時 217.75 回のジャンケンで一人勝ちになりました
9 人の時 740.9 回のジャンケンで一人勝ちになりました
10 人の時 2258.8 回のジャンケンで一人勝ちになりました
11 人の時 3811.85 回のジャンケンで一人勝ちになりました
12 人の時 22032.85 回のジャンケンで一人勝ちになりました
13 人の時 40635.15 回のジャンケンで一人勝ちになりました
14 人の時 85129.2 回のジャンケンで一人勝ちになりました
15 人の時 242720.1 回のジャンケンで一人勝ちになりました

同じ誕生日の人 - しばっち

2026/04/12 (Sun) 07:41:52

クラス内に誕生日が同じ人がいる確率


Mathフォルダ内のBIRTHDAY.BASのシュミレーション


RANDOMIZE
LET M=300 ! 試行回数
INPUT PROMPT "1クラスの人数=":N
DIM A(N),P(365)
FOR K=1 TO M
MAT P=ZER
FOR I=1 TO N
LET A(I)=INT(RND*365+1) ! クラスの誕生日
NEXT I
FOR I=1 TO N
LET P(A(I))=P(A(I))+1 ! 同じ誕生日をカウント
NEXT I
FOR I=1 TO 365
IF P(I)>=2 THEN
LET C=C+1
EXIT FOR
END IF
NEXT I
NEXT K
PRINT "同じ誕生日の人がいる確率";C/M*100;"%"
END
----------------------------------------------------------
300回試行して平均求めてみた。


RANDOMIZE
LET M=300 ! 試行回数
DIM A(50),P(365)
FOR N=2 TO 50 ! 人数
LET C=0
FOR K=1 TO M
MAT P=ZER
FOR I=1 TO N
LET A(I)=INT(RND*365+1) ! クラスの誕生日
NEXT I
FOR I=1 TO N
LET P(A(I))=P(A(I))+1 ! 同じ誕生日をカウント
NEXT I
FOR I=1 TO 365
IF P(I)>=2 THEN
LET C=C+1
EXIT FOR
END IF
NEXT I
NEXT K
PRINT N;"人のクラスの中に同じ誕生の日の人がいる確率";C/M*100;"%"
NEXT N
END

          実行結果


2 人のクラスの中に同じ誕生の日の人がいる確率 .333333333333333 %
3 人のクラスの中に同じ誕生の日の人がいる確率 1.33333333333333 %
4 人のクラスの中に同じ誕生の日の人がいる確率 3.33333333333333 %
5 人のクラスの中に同じ誕生の日の人がいる確率 3 %
6 人のクラスの中に同じ誕生の日の人がいる確率 2.66666666666667 %
7 人のクラスの中に同じ誕生の日の人がいる確率 5 %
8 人のクラスの中に同じ誕生の日の人がいる確率 7.33333333333333 %
9 人のクラスの中に同じ誕生の日の人がいる確率 10 %
10 人のクラスの中に同じ誕生の日の人がいる確率 14.3333333333333 %
11 人のクラスの中に同じ誕生の日の人がいる確率 13.6666666666667 %
12 人のクラスの中に同じ誕生の日の人がいる確率 15 %
13 人のクラスの中に同じ誕生の日の人がいる確率 18 %
14 人のクラスの中に同じ誕生の日の人がいる確率 22 %
15 人のクラスの中に同じ誕生の日の人がいる確率 27 %
16 人のクラスの中に同じ誕生の日の人がいる確率 24.3333333333333 %
17 人のクラスの中に同じ誕生の日の人がいる確率 34.3333333333333 %
18 人のクラスの中に同じ誕生の日の人がいる確率 32.3333333333333 %
19 人のクラスの中に同じ誕生の日の人がいる確率 40 %
20 人のクラスの中に同じ誕生の日の人がいる確率 41 %
21 人のクラスの中に同じ誕生の日の人がいる確率 45.6666666666667 %
22 人のクラスの中に同じ誕生の日の人がいる確率 50 %
23 人のクラスの中に同じ誕生の日の人がいる確率 50.3333333333333 %
24 人のクラスの中に同じ誕生の日の人がいる確率 54.6666666666667 %
25 人のクラスの中に同じ誕生の日の人がいる確率 56 %
26 人のクラスの中に同じ誕生の日の人がいる確率 57.6666666666667 %
27 人のクラスの中に同じ誕生の日の人がいる確率 61.3333333333333 %
28 人のクラスの中に同じ誕生の日の人がいる確率 67.3333333333333 %
29 人のクラスの中に同じ誕生の日の人がいる確率 67.6666666666667 %
30 人のクラスの中に同じ誕生の日の人がいる確率 71.6666666666667 %
31 人のクラスの中に同じ誕生の日の人がいる確率 71.3333333333333 %
32 人のクラスの中に同じ誕生の日の人がいる確率 74.3333333333333 %
33 人のクラスの中に同じ誕生の日の人がいる確率 79.6666666666667 %
34 人のクラスの中に同じ誕生の日の人がいる確率 76.6666666666667 %
35 人のクラスの中に同じ誕生の日の人がいる確率 81.6666666666667 %
36 人のクラスの中に同じ誕生の日の人がいる確率 82.6666666666667 %
37 人のクラスの中に同じ誕生の日の人がいる確率 86 %
38 人のクラスの中に同じ誕生の日の人がいる確率 89 %
39 人のクラスの中に同じ誕生の日の人がいる確率 90.3333333333333 %
40 人のクラスの中に同じ誕生の日の人がいる確率 87 %
41 人のクラスの中に同じ誕生の日の人がいる確率 92 %
42 人のクラスの中に同じ誕生の日の人がいる確率 93.6666666666667 %
43 人のクラスの中に同じ誕生の日の人がいる確率 92.6666666666667 %
44 人のクラスの中に同じ誕生の日の人がいる確率 93 %
45 人のクラスの中に同じ誕生の日の人がいる確率 94.6666666666667 %
46 人のクラスの中に同じ誕生の日の人がいる確率 94.3333333333333 %
47 人のクラスの中に同じ誕生の日の人がいる確率 96 %
48 人のクラスの中に同じ誕生の日の人がいる確率 96.3333333333333 %
49 人のクラスの中に同じ誕生の日の人がいる確率 95.3333333333333 %
50 人のクラスの中に同じ誕生の日の人がいる確率 97.6666666666667 %
----------------------------------------------------------
確率から人数求めてみた。


RANDOMIZE
LET F=300 ! 試行回数
DIM A(100),P(365)
DO
INPUT PROMPT "同じ誕生日の人がいる確率 (%)":Z
LOOP UNTIL Z<100 AND Z>0
LET Z=Z/100
LET L=1
LET R=100 ! 人数
DO
LET N=INT((L+R)/2)
LET C=0
FOR K=1 TO F
MAT P=ZER
FOR I=1 TO N
LET A(I)=INT(RND*365+1) ! クラスの誕生日
NEXT I
FOR I=1 TO N
LET P(A(I))=P(A(I))+1 ! 同じ誕生日をカウント
NEXT I
FOR I=1 TO 365
IF P(I)>=2 THEN
LET C=C+1
EXIT FOR
END IF
NEXT I
NEXT K
IF C/F<Z THEN LET L=N ELSE LET R=N
LOOP UNTIL L=R
PRINT L;"人の時、同じ誕生日の人がいる確率";Z*100;"%になります"
END

Re: 同じ誕生日の人 - しばっち

2026/04/12 (Sun) 07:43:12

1クラス内に自分と同じ誕生日の人がいる確率


RANDOMIZE
LET M=300 ! 試行回数
INPUT PROMPT "1クラスの人数=":N
DIM A(N)
LET P=INT(RND*365+1) ! 自分の誕生日
FOR K=1 TO M
FOR I=1 TO N
LET A(I)=INT(RND*365+1) ! クラスの誕生日
NEXT I
FOR I=1 TO N
IF A(I)=P THEN
LET C=C+1 ! 自分と同じならカウント
EXIT FOR
END IF
NEXT I
NEXT K
PRINT "自分と同じ誕生日の人がいる確率";C/M*100;"%"
END
--------------------------------------------------------------
300回試行して平均求めてみた


RANDOMIZE
LET M=300 ! 試行回数
DIM A(50)
FOR N=2 TO 50 ! 人数
LET C=0
LET P=INT(RND*365+1) ! 自分の誕生日
FOR K=1 TO M
FOR I=1 TO N
LET A(I)=INT(RND*365+1) ! クラスの誕生日
NEXT I
FOR I=1 TO N
IF A(I)=P THEN
LET C=C+1 ! 自分と同じならカウント
EXIT FOR
END IF
NEXT I
NEXT K
PRINT N;"人のクラスの中に自分と同じ誕生の日の人がいる確率";C/M*100;"%"
NEXT N
END


          実行結果


2 人のクラスの中に自分と同じ誕生の日の人がいる確率 .333333333333333 %
3 人のクラスの中に自分と同じ誕生の日の人がいる確率 .666666666666667 %
4 人のクラスの中に自分と同じ誕生の日の人がいる確率 .333333333333333 %
5 人のクラスの中に自分と同じ誕生の日の人がいる確率 1.33333333333333 %
6 人のクラスの中に自分と同じ誕生の日の人がいる確率 2.33333333333333 %
7 人のクラスの中に自分と同じ誕生の日の人がいる確率 2.66666666666667 %
8 人のクラスの中に自分と同じ誕生の日の人がいる確率 2.66666666666667 %
9 人のクラスの中に自分と同じ誕生の日の人がいる確率 2.33333333333333 %
10 人のクラスの中に自分と同じ誕生の日の人がいる確率 6 %
11 人のクラスの中に自分と同じ誕生の日の人がいる確率 2.66666666666667 %
12 人のクラスの中に自分と同じ誕生の日の人がいる確率 3 %
13 人のクラスの中に自分と同じ誕生の日の人がいる確率 3.66666666666667 %
14 人のクラスの中に自分と同じ誕生の日の人がいる確率 5 %
15 人のクラスの中に自分と同じ誕生の日の人がいる確率 3.66666666666667 %
16 人のクラスの中に自分と同じ誕生の日の人がいる確率 3.33333333333333 %
17 人のクラスの中に自分と同じ誕生の日の人がいる確率 6 %
18 人のクラスの中に自分と同じ誕生の日の人がいる確率 3.66666666666667 %
19 人のクラスの中に自分と同じ誕生の日の人がいる確率 5.33333333333333 %
20 人のクラスの中に自分と同じ誕生の日の人がいる確率 6.33333333333333 %
21 人のクラスの中に自分と同じ誕生の日の人がいる確率 6.33333333333333 %
22 人のクラスの中に自分と同じ誕生の日の人がいる確率 6.66666666666667 %
23 人のクラスの中に自分と同じ誕生の日の人がいる確率 5.33333333333333 %
24 人のクラスの中に自分と同じ誕生の日の人がいる確率 6.33333333333333 %
25 人のクラスの中に自分と同じ誕生の日の人がいる確率 6.66666666666667 %
26 人のクラスの中に自分と同じ誕生の日の人がいる確率 6.66666666666667 %
27 人のクラスの中に自分と同じ誕生の日の人がいる確率 3.66666666666667 %
28 人のクラスの中に自分と同じ誕生の日の人がいる確率 7.33333333333333 %
29 人のクラスの中に自分と同じ誕生の日の人がいる確率 9.33333333333333 %
30 人のクラスの中に自分と同じ誕生の日の人がいる確率 5.33333333333333 %
31 人のクラスの中に自分と同じ誕生の日の人がいる確率 9 %
32 人のクラスの中に自分と同じ誕生の日の人がいる確率 7.66666666666667 %
33 人のクラスの中に自分と同じ誕生の日の人がいる確率 8.66666666666667 %
34 人のクラスの中に自分と同じ誕生の日の人がいる確率 8.66666666666667 %
35 人のクラスの中に自分と同じ誕生の日の人がいる確率 6.33333333333333 %
36 人のクラスの中に自分と同じ誕生の日の人がいる確率 8.66666666666667 %
37 人のクラスの中に自分と同じ誕生の日の人がいる確率 10.6666666666667 %
38 人のクラスの中に自分と同じ誕生の日の人がいる確率 7.66666666666667 %
39 人のクラスの中に自分と同じ誕生の日の人がいる確率 11.6666666666667 %
40 人のクラスの中に自分と同じ誕生の日の人がいる確率 7.66666666666667 %
41 人のクラスの中に自分と同じ誕生の日の人がいる確率 10.6666666666667 %
42 人のクラスの中に自分と同じ誕生の日の人がいる確率 10 %
43 人のクラスの中に自分と同じ誕生の日の人がいる確率 13.3333333333333 %
44 人のクラスの中に自分と同じ誕生の日の人がいる確率 12.3333333333333 %
45 人のクラスの中に自分と同じ誕生の日の人がいる確率 7.66666666666667 %
46 人のクラスの中に自分と同じ誕生の日の人がいる確率 11.6666666666667 %
47 人のクラスの中に自分と同じ誕生の日の人がいる確率 12.3333333333333 %
48 人のクラスの中に自分と同じ誕生の日の人がいる確率 9.66666666666667 %
49 人のクラスの中に自分と同じ誕生の日の人がいる確率 10.6666666666667 %
50 人のクラスの中に自分と同じ誕生の日の人がいる確率 13 %
--------------------------------------------------------------
確率から人数求めてみた


RANDOMIZE
LET F=300 ! 試行回数
DIM A(10000)
DO
INPUT PROMPT "自分と同じ誕生日の人がいる確率 (%)":Z
LOOP UNTIL Z<100 AND Z>0
LET Z=Z/100
LET L=1
LET R=10000 ! 人数
LET P=INT(RND*365+1)
DO
LET N=INT((L+R)/2)
LET C=0
FOR K=1 TO F
FOR I=1 TO N
LET A(I)=INT(RND*365+1) ! クラスの誕生日
NEXT I
FOR I=1 TO N
IF A(I)=P THEN
LET C=C+1
EXIT FOR
END IF
NEXT I
NEXT K
IF C/F<Z THEN LET L=N ELSE LET R=N
LOOP UNTIL L=R
PRINT L;"人の時、自分と同じ誕生日の人がいる確率";Z*100;"%になります"
END

カジノシュミレーション - しばっち

2026/04/05 (Sun) 07:59:54

カジノシュミレーション

https://www.casino-winnersclub.com/monte-carlo.php
https://rikei-logistics.com/monte-carlo-roulette
https://casimaru.com/monte-carlo-method/


RANDOMIZE
DIM MONTE(1000)
LET MONEY=100 ! 所持金
SET WINDOW -5,100,-10,500
DRAW GRID(5,20)
PLOT LINES:0,MONEY;
FOR I=1 TO 100 ! 試行回数
LET COUNT=0
MAT MONTE=ZER
LET HEAD=1
LET TAIL=3
LET MONTE(HEAD)=1
LET MONTE(HEAD+1)=2
LET MONTE(TAIL)=3
DO
LET COUNT=COUNT+1
LET PAY=MONTE(HEAD)+MONTE(TAIL) ! 賭け金
IF INT(RND*2)=1 THEN ! 勝ちなら
LET MONEY=MONEY+PAY
LET MONTE(HEAD)=0
LET MONTE(TAIL)=0
LET HEAD=HEAD+1
LET TAIL=TAIL-1
IF ABS(TAIL-HEAD)<=1 THEN EXIT DO ! 終了
ELSE ! 負けなら
LET MONEY=MONEY-PAY
LET MONTE(TAIL+1)=MONTE(HEAD)+MONTE(TAIL)
LET TAIL=TAIL+1
END IF
LOOP UNTIL MONEY<=0
PLOT LINES:I,MONEY;
PRINT I;"回目"
PRINT COUNT;"回繰り返し"
PRINT "所持金 ";MONEY
IF MONEY<=0 THEN EXIT FOR
NEXT I
IF MONEY<=0 THEN
PRINT "破産しました。失敗です"
ELSE
PRINT "所持金が";MONEY-100;"増えました。成功です。"
END IF
END

すごろくをちょうど終了できる確率 - しばっち

2026/04/05 (Sun) 07:58:50

! すごろくをちょうど終了できる確率
RANDOMIZE
LET K=500 ! 試行回数
FOR I=1 TO K
LET S=0
DO ! すごろく
LET S=S+INT(RND*6+1) ! サイコロ
LOOP UNTIL S>=100
IF S=100 THEN LET N=N+1 ! ちょうどゴールに到達したら
NEXT I
PRINT N/K*100;"%"
END

トランプをめくって途中で一致する確率 - しばっち

2026/04/05 (Sun) 07:57:19

!それぞれ1組ずつのトランプをめくって途中で一致する確率
RANDOMIZE
LET N=300
FOR J=1 TO N
FOR I=1 TO 53
IF INT(RND*53+1)=INT(RND*53+1) THEN
LET K=K+1
EXIT FOR
END IF
NEXT I
NEXT J
PRINT K/N*100;"%"
END

プレゼント交換で自身のプレゼントに当たる確率 - しばっち

2026/04/05 (Sun) 07:56:01

! プレゼント交換で自身のプレゼントに当たる確率
LET N=50 ! 人数
LET L=500 ! 試行回数
DIM A(N)
FOR J=1 TO L
FOR I=1 TO N
LET A(I)=I
NEXT I
FOR I=1 TO N
SWAP A(I),A(INT(RND*N+1)) ! プレゼント交換
NEXT I
FOR I=1 TO N
IF A(I)=I THEN LET K=K+1 ! 自身のプレゼント
NEXT I
NEXT J
PRINT K/L*100;"%"
END
------------------------------------------------------
! プレゼント交換で自分のプレゼントに当たる確率
INPUT PROMPT "人数=":N
LET L=500 ! 試行回数
DIM A(N)
FOR J=1 TO L
LET P=INT(RND*N+1) ! 自分のプレゼント
FOR I=1 TO N
LET A(I)=I
NEXT I
FOR I=1 TO N
SWAP A(I),A(INT(RND*N+1)) ! プレゼント交換
NEXT I
IF A(P)=P THEN LET K=K+1 ! 自分のプレゼント
NEXT J
PRINT K/L*100;"%"
END

十進BASIC版:素数計数関数 pi(x)正確値計算プログラム - Tarosa

2026/03/20 (Fri) 21:15:08

プロセッサ Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz (2.11 GHz)
実装 RAM 8.00 GB (7.84 GB 使用可能)
エディション Windows 11 Home
バージョン 25H2

タスクマネージャー(CPU 2.5GHz 前後 使用率25% 程度 

BASIC Accelerator Ver. 1.2.2.6(2025.11.08)

Lazarus Windows 64ビット版/ Lazarus 4.6
lazarus-4.6-fpc-3.2.2-win64.exe


!十進BASIC版:素数計数関数 pi(x)正確値計算プログラム
DECLARE EXTERNAL FUNCTION PI_COUNT_EXACT
OPTION ARITHMETIC NATIVE
!OPTION ARITHMETIC RATIONAL
! --- 設定 ---
LET x = 10000000000000 ! 10兆 (10^13)
PRINT x; " の正確な素数個数を計算します。"
LET t0 = TIME

! --- メイン計算呼び出し ---
LET result = PI_COUNT_EXACT(x)
PRINT "------------------------------"
PRINT "結果(正確な値):"; result
PRINT "計算時間:"; TIME - t0; " 秒"
PRINT "------------------------------"
END

! --- 高速素数計数ルーチン (Lucy Hedgehog法) ---
EXTERNAL FUNCTION PI_COUNT_EXACT(n)
OPTION ARITHMETIC NATIVE
!OPTION ARITHMETIC RATIONAL

LET limit = INT(SQR(n))
! 1. 値の候補 (n/i) を抽出して配列のサイズを決定
! 10^13の場合、約632万個の要素が必要

LET num_values = 0
LET i1 = 1

DO WHILE i1 <= n
LET num_values = num_values + 1
LET v1 = INT(n / i1)
LET i1 = INT(n / v1) + 1
LOOP

! 配列の確保 (V: 値の保持, S: その値以下の素数個数)

DIM V(6400000)
DIM S(6400000)

! 2. 初期値の設定

LET idx = 0
LET i1 = 1

DO WHILE i1 <= n
LET idx = idx + 1
LET v1 = INT(n / i1)
LET V(idx) = v1
LET S(idx) = v1 - 1 ! 初期値は v1-1 (1を除く個数)
LET i1 = INT(n / v1) + 1
LOOP

LET max_idx = idx

! 3. エラトステネスの篩による更新

PRINT "計算開始... 要素数:"; max_idx
FOR p = 2 TO limit

! S(p) > S(p-1) なら p は素数
! 十進BASICではS(p)の直接参照が難しいため、Vの中からpの位置を探す
! 実際には p <= limit なので V の後ろの方にある

LET p_idx = max_idx - p + 1

IF S(p_idx) > S(p_idx + 1) THEN
LET sp_1 = S(p_idx + 1)
LET p2 = p * p

FOR j = 1 TO max_idx
IF V(j) < p2 THEN EXIT FOR

! V(j)/p がどこにあるか計算
LET next_v = INT(V(j) / p)
IF next_v <= LIMIT THEN
LET target_idx = max_idx - next_v + 1
ELSE
LET target_idx = INT(n / next_v)
END IF
LET S(j) = S(j) - (S(target_idx) - sp_1)
NEXT j

IF MOD(p, 5000) = 0 THEN
PRINT "現在 p="; p; " まで完了 /"; LIMIT
END IF
END IF
NEXT p

LET PI_COUNT_EXACT = S(1)
END FUNCTION


計算結果

10000000000000 の正確な素数個数を計算します。
計算開始... 要素数: 6324554
------------------------------
結果(正確な値): 346065536839
計算時間: 45.3410000000003 秒
------------------------------
346065536839 素数定理 参照
https://ja.wikipedia.org/wiki/%E7%B4%A0%E6%95%B0%E5%AE%9A%E7%90%86


LET x = 1000000000000 ! (10^12)

1000000000000 の正確な素数個数を計算します。
計算開始... 要素数: 1999999
------------------------------
結果(正確な値): 37607912018
計算時間: 8.12299999999232 秒
------------------------------

LET x = 100000000000 ! (10^11)

100000000000 の正確な素数個数を計算します。
計算開始... 要素数: 632454
------------------------------
結果(正確な値): 4118054813
計算時間: 1.59799999999814 秒
------------------------------

LET x = 10000000000 ! (10^10)

10000000000 の正確な素数個数を計算します。
計算開始... 要素数: 199999
------------------------------
結果(正確な値): 455052511
計算時間: 0.334000000002561 秒
------------------------------

Re: 十進BASIC版:素数計数関数 pi(x)正確値計算プログラム - しばっち

2026/04/05 (Sun) 07:54:18

私も素数個数関数をルジャンドル法で作ってみた。
とりあえずやっと動くようになりました。

まだ改良の余地はあるかとは思いますが
参考程度にはなるかと思います。


https://mathworld.wolfram.com/LegendresFormula.html
https://www.hs.chuo-u.ac.jp/contents/wp-content/themes/chu-fu/pdf/bulletin/issue30/issue30_pdf10.pdf
https://rosettacode.org/wiki/Legendre_prime_counting_function


OPTION BASE 0
LET N=1000000
PUBLIC NUMERIC PICACHE(10000),PRIME(10000),CACHE(10000,100),COUNT
MAT CACHE=(-1)*CON
CALL PRIMESIEVE(INT(SQR(N)))
PRINT π(N)
END

EXTERNAL SUB PRIMESIEVE(N)
MAT PICACHE=CON
LET PICACHE(1)=0
LET COUNT=0
FOR I=2 TO N
IF PICACHE(I)=1 THEN
LET COUNT=COUNT+1
LET PRIME(COUNT)=I
FOR J=I*I TO N STEP I
LET PICACHE(J)=0
NEXT J
END IF
NEXT I
FOR I=1 TO N-1
LET PICACHE(I+1)=PICACHE(I+1)+PICACHE(I)
NEXT I
END SUB

EXTERNAL FUNCTION φ(X,A)
IF X=0 THEN
LET φ=0
EXIT FUNCTION
END IF
IF X=1 THEN
LET φ=1
EXIT FUNCTION
END IF
IF A=1 THEN
LET φ=IP(X/2)
LET CACHE(X,1)=IP(X/2)
EXIT FUNCTION
END IF
IF A=2 THEN
LET φ=IP(X/3)
LET CACHE(X,2)=IP(X/3)
EXIT FUNCTION
END IF
IF A=3 THEN ! COMB(3,1)+COMB(3,2)+COMB(3,3) 2,3,5
LET S=X-IP(X/2)-IP(X/3)-IP(X/5)+IP(X/(2*3))+IP(X/(2*5))+IP(X/(3*5))-IP(X/(2*3*5))
LET φ=S
IF X<10000 THEN LET CACHE(X,3)=S
EXIT FUNCTION
END IF
IF A=4 THEN ! COMB(4,1)+COMB(4,2)+COMB(4,3)+COMB(4,4) 2,3,5,7
LET S=X-IP(X/2)-IP(X/3)-IP(X/5)-IP(X/7)+IP(X/(2*3))+IP(X/(2*5))+IP(X/(2*7))+IP(X/(3*5))+IP(X/(3*7))+IP(X/(5*7))-IP(X/(2*3*5))-IP(X/(2*3*7))-IP(X/(2*5*7))-IP(X/(3*5*7))+IP(X/(2*3*5*7))
LET φ=S
IF X<10000 THEN LET CACHE(X,4)=S
EXIT FUNCTION
END IF
IF A=5 THEN ! COMB(5,1)+COMB(5,2)+COMB(5,3)+COMB(5,4)+COMB(5,5) 2,3,5,7,11
LET S=X-IP(X/2)-IP(X/3)-IP(X/5)-IP(X/7)-IP(X/11)+IP(X/(2*3))+IP(X/(2*5))+IP(X/(2*7))+IP(X/(2*11))+IP(X/(3*5))+IP(X/(3*7))+IP(X/(3*11))+IP(X/(5*7))+IP(X/(5*11))+IP(X/(7*11))
LET S=S-IP(X/(2*3*5))-IP(X/(2*3*7))-IP(X/(2*3*11))-IP(X/(2*5*7))-IP(X/(2*5*11))-IP(X/(2*7*11))-IP(X/(3*5*7))-IP(X/(3*5*11))-IP(X/(3*7*11))-IP(X/(5*7*11))
LET S=S+IP(X/(2*3*5*7))+IP(X/(2*3*5*11))+IP(X/(2*3*7*11))+IP(X/(2*5*7*11))+IP(X/(3*5*7*11))-IP(X/(2*3*5*7*11))
LET φ=S
IF X<10000 THEN LET CACHE(X,5)=S
EXIT FUNCTION
END IF
IF X<10000 AND A<100 AND CACHE(X,A)<>-1 THEN
LET S=CACHE(X,A)
ELSE
LET S=φ(X,A-1)
IF X<10000 AND A<100 THEN LET CACHE(X,A)=S
END IF
LET XX=IP(X/PRIME(A))
IF XX<10000 AND A<100 AND CACHE(XX,A)<>-1 THEN
LET T=CACHE(XX,A)
ELSE
LET T=φ(XX,A-1)
IF XX<10000 AND A<100 THEN LET CACHE(XX,A)=T
END IF
LET φ=S-T
END FUNCTION

EXTERNAL FUNCTION π(X)
IF X<=PRIME(COUNT) THEN
LET π=PICACHE(X)
EXIT FUNCTION
END IF
!LET T=π(INT(SQR(X)))
LET T=COUNT
LET π=T+φ(X,T)-1
END FUNCTION

要望 - しばっち

2026/03/15 (Sun) 07:50:18

複素数モード時においてEXP(N*LOG(X))を
^(ペキ乗)で記述できるようにできませんか?


OPTION ARITHMETIC COMPLEX
LET X=-2.5
LET N=3.5
PRINT EXP(N*LOG(X)) ! OK
!PRINT X^N ! エラー
END

Re: 要望 SHIRAISHI Kazuo

2026/03/15 (Sun) 13:16:47

X^N = EXP(N*LOG(X)) と定義してしまえば可能ですが,一般には負数の非整数乗は未定義とします。
たとえば,
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14250831054
要するに,値が1つに定まらないからで,0÷0を未定義にするのと同様の理屈です。

e=mc^2 - しばっち

2026/03/15 (Sun) 07:55:43

E=MC^2
アインシュタインの有名な方程式で計算してみた。

https://ja.wikipedia.org/wiki/質量とエネルギーの等価性


私は決してメタボではない(と思っている)がおなかの脂肪10Kgをエネルギーに変え電力にして
それを1KW/h=15円で売ったなら(3.7兆円 !?)一生遊んで暮らせるぞと思うのは私だけだろうか?



LET C=299792458 ! (m/s) 光速
INPUT PROMPT "質量(Kg)=":M
LET E=M*C^2
LET CAL=E/4.184 ! 4.184ジュール=1カロリー
CALL DISPLAY(E,"ジュール") ! J (Kg・m^2/s^2)
CALL DISPLAY(CAL,"カロリー")
CALL DISPLAY(CAL/100/1000,"キログラムの水を0度から100度に沸騰させる")
CALL DISPLAY(E/3600/1000,"キロワットh") ! KW・h
PRINT "買取価格 ";
CALL DISPLAY(E/3600/1000*15,"円") ! 1KW/h=15円
PRINT "東京ドーム ";
CALL DISPLAY(CAL/100/1240000000/1000,"杯分の水を沸騰させる") ! 東京ドーム1杯 1240000000リットル
END

EXTERNAL SUB DISPLAY(P,D$)
LET P$=USING$(REPEAT$("#",68),INT(P))
LET Q$=USING$(".####",FP(P))
DIM S$(18)
FOR I=LEN(P$) TO 1 STEP -4
LET N=N+1
LET S$(N)=P$(I-3:I)
LET S$(N)=LTRIM$(S$(N))
NEXT I
IF S$(2)<>"" THEN LET S$(2)=S$(2)&"万"
IF S$(3)<>"" THEN LET S$(3)=S$(3)&"億"
IF S$(4)<>"" THEN LET S$(4)=S$(4)&"兆"
IF S$(5)<>"" THEN LET S$(5)=S$(5)&"京"
IF S$(6)<>"" THEN LET S$(6)=S$(6)&"垓"
IF S$(7)<>"" THEN LET S$(7)=S$(7)&"じょ"
IF S$(8)<>"" THEN LET S$(8)=S$(8)&"穣"
IF S$(9)<>"" THEN LET S$(9)=S$(9)&"溝"
IF S$(10)<>"" THEN LET S$(10)=S$(10)&"澗"
IF S$(11)<>"" THEN LET S$(11)=S$(11)&"正"
IF S$(12)<>"" THEN LET S$(12)=S$(12)&"載"
IF S$(13)<>"" THEN LET S$(13)=S$(13)&"極"
IF S$(14)<>"" THEN LET S$(14)=S$(14)&"恒河沙"
IF S$(15)<>"" THEN LET S$(15)=S$(15)&"阿僧祇"
IF S$(16)<>"" THEN LET S$(16)=S$(16)&"那由他"
IF S$(17)<>"" THEN LET S$(17)=S$(17)&"不可思議"
IF S$(18)<>"" THEN LET S$(18)=S$(18)&"無料大数"
FOR I=18 TO 1 STEP -1
PRINT S$(I);
NEXT I
PRINT Q$;D$
END SUB


          実行結果


質量(Kg)=10
89京8755兆1787億3681万7664.0000ジュール
21京4807兆6431億0153万3856.0000カロリー
2兆1480億7643万1015.3384キログラムの水を0度から100度に沸騰させる
2496億5421万6315.7827キロワットh
買取価格 3兆7448億1324万4736.7402円
東京ドーム 1732.3197杯分の水を沸騰させる

最上位桁の分布 - しばっち

2026/03/15 (Sun) 07:54:11

2^nの最上位桁の数字の分布

2^1~2^1000までの最上位桁の数字の分布を求めてみた。


DIM A(9)
FOR N=1 TO 1000
LET P=FP(N*LOG10(2)) ! 2^n
LET K=INT(10^P)
LET A(K)=A(K)+1
NEXT N
SET WINDOW -1,9,-10,350
DRAW GRID(1,50)
FOR I=1 TO 9
PLOT LINES:I,A(I);
NEXT I
END
------------------------------------------------------------
2^nの最上位から2桁目の数字の分布


DIM A(0 TO 9)
FOR I=1 TO 1000
LET P=FP(I*LOG10(2))
LET K=MOD(INT(10^P*10),10)
LET A(K)=A(K)+1
NEXT I
SET WINDOW -1,9,-10,200
DRAW GRID(1,50)
FOR I=0 TO 9
PLOT LINES:I,A(I);
NEXT I
END
------------------------------------------------------------
2^nの末尾桁の数字の分布


DIM A(0 TO 9)
LET K=1
FOR I=1 TO 1000
LET K=MOD(K*2,10)
LET A(K)=A(K)+1
NEXT I
SET WINDOW -1,9,-10,300
DRAW GRID(1,50)
FOR I=0 TO 9
PLOT LINES:I,A(I);
NEXT I
END

スーパー円 - しばっち

2026/03/15 (Sun) 07:52:42

スーパー円


OPTION ANGLE DEGREES
SET WINDOW -1,1,-1,1
LOCATE VALUE NOWAIT(1),RANGE 0 TO 2:N1
LOCATE VALUE NOWAIT(2),RANGE 0 TO 2:N2
!LOCATE VALUE NOWAIT(3),RANGE 0 TO 2:N3
LOCATE VALUE NOWAIT(4),RANGE 3 TO 20,AT 3:M
LOCATE VALUE NOWAIT(5),RANGE .1 TO 1:A
LOCATE VALUE NOWAIT(6),RANGE .1 TO 1:B
DO
LOCATE VALUE NOWAIT(1):N1
LOCATE VALUE NOWAIT(2):N2
! LOCATE VALUE NOWAIT(3):N3
LOCATE VALUE NOWAIT(4):M
LOCATE VALUE NOWAIT(5):A
LOCATE VALUE NOWAIT(6):B
LET N3=N2
DRAW GRID(.1,.1)
FOR T=0 TO 360
LET R=1/(ABS(1/A*COS(M/4*T))^N2+ABS(1/B*SIN(M/4*T))^N3)^(1/N1)
LET X=R*COS(T)
LET Y=R*SIN(T)
PLOT LINES:X,Y;
NEXT T
PLOT LINES
SET DRAW MODE EXPLICIT
WAIT DELAY .1
SET DRAW MODE HIDDEN
CLEAR
LOOP
END
-----------------------------------------------------------------------------------
OPTION ANGLE DEGREES
SET WINDOW -3,3,-3,3
DRAW GRID(1,1)
LET RR=1
LOCATE VALUE NOWAIT(1),RANGE 0 TO 1:A
LOCATE VALUE NOWAIT(2),RANGE 0 TO 1:B
LOCATE VALUE NOWAIT(3),RANGE 0 TO 1:C
LOCATE VALUE NOWAIT(4),RANGE 0 TO 360,AT 0:TH1
LOCATE VALUE NOWAIT(5),RANGE 0 TO 360,AT 0:TH2
LOCATE VALUE NOWAIT(6),RANGE 0 TO 360,AT 0:TH3
DO
LOCATE VALUE NOWAIT(1):A
LOCATE VALUE NOWAIT(2):B
LOCATE VALUE NOWAIT(3):C
LOCATE VALUE NOWAIT(4):TH1
LOCATE VALUE NOWAIT(5):TH2
LOCATE VALUE NOWAIT(6):TH3
DRAW GRID(1,1)
FOR T=0 TO 360
LET R=RR*(1+A*COS(T+TH1)+B*COS(2*T+TH2)+C*COS(3*T+TH3))
LET X=R*COS(T)
LET Y=R*SIN(T)
PLOT LINES:X,Y;
NEXT T
PLOT LINES
SET DRAW MODE EXPLICIT
WAIT DELAY .1
SET DRAW MODE HIDDEN
CLEAR
LOOP
END

COS模様 - しばっち

2026/03/15 (Sun) 07:51:41

色々なパターンの模様が描ける


PUBLIC NUMERIC L
SET POINT STYLE 1
LET SIZE=8
SET WINDOW -SIZE,SIZE,-SIZE,SIZE
ASK BITMAP SIZE XSIZE,YSIZE
LET L=XSIZE/SIZE
FOR N=1 TO 10
FOR M=1 TO 10
CLEAR
IF M<>N THEN
FOR Y=0 TO YSIZE
FOR X=0 TO XSIZE
IF ABS(F(X,Y,M,N))<.1 THEN
PLOT POINTS : WORLDX(X),WORLDY(Y)
END IF
NEXT X
NEXT Y
WAIT DELAY 1
END IF
NEXT M
NEXT N
END

EXTERNAL FUNCTION F(X,Y,M,N)
LET F=COS(N*X*PI/L)*COS(M*Y*PI/L)-COS(M*X*PI/L)*COS(N*Y*PI/L)
END FUNCTION

十進BASIC7.8.8の文字化け

2026/03/07 (Sat) 07:57:18

皆様、いつもありがとうございます。

初歩的な質問で申し訳ございません。
最新バージョンの7.8.8にて、文字化けが発生します。
最初は、日本語が「???」で全く表示されなかったのですが、OSのローケルや表示を日本語優先にすることである程度は直りましたが、一部、文字化けが治りません。

該当文字列だけ、文字コードが異なるのではないかと推定しております。

ほかに直し方がお分かりでしたら、お教えいただけますでしょうか。


OS:Windows 11 Pro 25H2 26200.7840

よろしくお願いいたします。

Re: 十進BASIC7.8.8の文字化け SHIRAISHI Kazuo

2026/03/07 (Sat) 10:17:04

7.8.8以前のバージョンでは問題ないのでしょうか。
ver. 7.8.7.7と7.8.7.6が https://decimalbasic.web.fc2.com/basicw32.htm から入手可能です。

なお,Windows 11 Home 25H2 26200.7840 でテストする範囲では正常です。

Re: 十進BASIC7.8.8の文字化け - knoike

2026/03/07 (Sat) 12:39:21

knoike です。ここでは初めて書き込みます。

設定 → 時刻と言語 → 言語と地域
で、
[Windows の表示言語] の右端の v をクリックして展開される項目の
[ベータ版: 世界中の言語に対応するために Unicode UTF-8 を使用します]

[オン] になっていると化けます。
デフォルトは [オフ] で、[オフ] なら化けません。正常に表示されます。

「OSのローケルや表示を日本語優先にすることである程度は直りましたが、」という書き込みから、
言語パックをいくつかインストールしてあるのだと想像していますが、
たいていのアプリはここの設定が [オフ] のままで正常に表示できるような多言語対応がなされていると思いますので、
特別な事情がない限りは [オフ] にしておくとよいのではないでしょうか。

Re: 十進BASIC7.8.8の文字化け

2026/03/07 (Sat) 20:44:35

ありがとうございます。

>SHIRAISHI Kazuo さん
旧バージョンを試してみましたが、結果は同じでした。

>knoikeさん
ご指摘の部分がONでしたので、OFFにしてみましたが、改善は見られませんでした。

みなさん、ご指摘の通り、私のwindows 11の環境が怪しそうなので、まず、OS周りで不具合がないか、一度確認してみます。

ありがとうございました。

Re: 十進BASIC7.8.8の文字化け

2026/03/07 (Sat) 20:53:31

今、試しで、「十進BASIC ver. 8」を使ってみたら、全く文字化けがありません。


文字コードがutf-8に対応した、ということですが、Version 7の中の別の文字コードが化けている可能性があるのでは、と推定しています。

現時点で、Version 8であれば文字化けは発生しませんので、当面はこちらを使いたいと思います。

ありがとうございました。

Re: 十進BASIC7.8.8の文字化け SHIRAISHI Kazuo

2026/03/08 (Sun) 07:55:50

設定 → 時刻と言語 → 言語と地域 [ベータ版: 世界中の言語に対応するために Unicode UTF-8 を使用します] を試してみました。
投稿された通りの結果になります。
Ver.7は内部でshift-JISを採用しています。また,「機能語挿入」の内容部分は BASIC.kwFとBASIC.kwSから読み込んでいます。
BASIC.kwFとBASIC.kwSはshift-JISで書かれているので文字化けして当然ですが,それ以外の部分はβ版で未対応なのだろうと思います。
なお,Ver.7 日本語版の翻訳系は,文字コードがShift-JISであることを前提にしています。UTF-8の文字を含むプログラムは,おそらく正常に実行できません。

Re: 十進BASIC7.8.8の文字化け SHIRAISHI Kazuo

2026/03/08 (Sun) 11:59:40

十進BASIC Ver.8は,内部文字コードがUTF-8ですが,Windows APIは16ビットwide文字対応版を使うので,Windowsのlocaleの影響を受けません。
BASICAccなども同様です。

Re: 十進BASIC7.8.8の文字化け SHIRAISHI Kazuo

2026/03/09 (Mon) 09:21:33

十進BASIC ver.8(日本語版)はWindowsのコードページ設定に関係なく日本語で動作します。
Ver.8でもWindows APIの呼び出しが使えます。
https://decimalbasic.web.fc2.com/ExtDLL.htm
WindowsAPIのMessageBoxAは,ANSI文字でメッセージボックスを表示します。
WindowsのANSI文字というのは,Windowsのコードページごとに定まる文字のことで,日本語版WindowsではShift-JISのことです。

DECLARE EXTERNAL FUNCTION MesBox
LET n=MesBox(0,"日本語","BASIC",3)
PRINT n
END
EXTERNAL FUNCTION MesBox(owner,text$,caption$,flag)
ASSIGN "user32.dll","MessageBoxA"
END FUNCTION

をVer.8で実行すると文字化けします(Ver.8で"日本語"がUTF-8文字なので)。
"日本語" のところを ANSI$("日本語") に変えると正常に機能します。
ANSI$関数は,コードページの指定にしたがってUTF-8文字列をANSI文字列に変える関数です。
MessageBoxAの説明は
https://learn.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-messageboxa
にあります。

「世界中の言語に対応するために Unicode UTF-8 を使用します」の意味は,ANSI文字としてUTF-8を採用することのように思われます。
Ver.8はWindowsの言語設定を変えても動作するので,テストしてみていただけないでしょうか。

Re: 十進BASIC7.8.8の文字化け

2026/03/14 (Sat) 19:05:46

返信が遅くなり、申し訳ございません。

承知しました。
WindowsAPIの利用含め、Version.8を一通り試して、何か気が付いた点がございましたら、また報告させていただきます。

お時間いただきまして、ありがとうございました。

よろしくお願いいたします。

ローテートパズル - しばっち

2026/03/01 (Sun) 07:47:11

バラバラになった数字をローテートさせながら
数字を揃えるパズルです。

シャッフル回数を入れるとゲーム開始です。
マウスで矢印をクリックすると数字がローテーション
します。

Rキーでリトライ(リスタート)
Gキーでギブアップになります。



DECLARE FUNCTION CHECK
RANDOMIZE
CALL GINIT(800,800)
LET SIZE=3
DIM M(SIZE,SIZE),T(SIZE,SIZE),XS(50),YS(50),NS(50)
SET TEXT JUSTIFY "CENTER","HALF"
SET TEXT BACKGROUND "OPAQUE"
FOR J=1 TO SIZE
FOR I=1 TO SIZE
LET M(I,J)=SIZE*(J-1)+I
NEXT I
NEXT J
CALL DISPLAY
CALL DISPLAY2(0,0)
INPUT PROMPT "シャッフル回数(5-50)=":NN
FOR K=1 TO NN ! 問題作成
LET X=INT(RND*3+1)
LET Y=INT(RND*3+1)
LET N=INT(RND*4+1)
CALL ROTATE(N,X,Y)
LET XS(K)=X
LET YS(K)=Y
IF N=1 OR N=2 THEN
LET NS(K)=3-N
END IF
IF N=3 OR N=4 THEN
LET NS(K)=7-N
END IF
CALL DISPLAY
WAIT DELAY .1
NEXT K
MAT T=M ! 面データコピー
DO ! ゲーム開始
CLEAR
CALL DISPLAY
CALL DISPLAY2(0,0)
SET DRAW MODE EXPLICIT
IF CHECK=1 THEN EXIT DO ! 揃ったら
DO
IF GETKEYSTATE(ORD("R"))<0 OR GETKEYSTATE(ORD("r"))<0 THEN ! リトライ(リスタート)
MAT M=T
CALL DISPLAY
END IF
IF GETKEYSTATE(ORD("G"))<0 OR GETKEYSTATE(ORD("g"))<0 THEN ! ギブアップ
MAT M=T
CALL DISPLAY
FOR K=NN TO 1 STEP -1 ! 解答表示
CALL ROTATE(NS(K),XS(K),YS(K))
CALL DISPLAY
CALL DISPLAY2(100+300/SIZE+600/SIZE*(XS(K)-1),100+300/SIZE+600/SIZE*(YS(K)-1))
WAIT DELAY .5
NEXT K
STOP
END IF
MOUSE POLL MX,MY,LEFT,RIGHT ! マウス入力
LOOP UNTIL LEFT=1 OR RIGHT=1 ! クリックしたら
DO
MOUSE POLL MX,MY,LEFT,RIGHT
LOOP WHILE LEFT=1 OR RIGHT=1
CALL DISPLAY2(MX,MY)
IF MX<100 THEN
LET Y=INT((MY-100)/(600/SIZE))+1
CALL ROTATE(1,X,Y)
END IF
IF MX>700 THEN
LET Y=INT((MY-100)/(600/SIZE))+1
CALL ROTATE(2,X,Y)
END IF
IF MY<100 THEN
LET X=INT((MX-100)/(600/SIZE))+1
CALL ROTATE(3,X,Y)
END IF
IF MY>700 THEN
LET X=INT((MX-100)/(600/SIZE))+1
CALL ROTATE(4,X,Y)
END IF
SET DRAW MODE HIDDEN
WAIT DELAY .3
LOOP
SET TEXT HEIGHT 80
SET TEXT BACKGROUND "TRANSPARENT"
SET TEXT COLOR 2
PLOT TEXT ,AT 400,400:"Congratulations"

SUB DISPLAY ! 画面表示
SET LINE COLOR 7
SET TEXT COLOR 7
SET TEXT HEIGHT 300/SIZE
SET TEXT BACKGROUND "OPAQUE"
FOR X=100 TO 700 STEP 600/SIZE
PLOT LINES : X,0;X,800
NEXT X
FOR Y=100 TO 700 STEP 600/SIZE
PLOT LINES : 0,Y;800,Y
NEXT Y
FOR J=1 TO SIZE
FOR I=1 TO SIZE
PLOT TEXT ,AT 100+300/SIZE+600/SIZE*(I-1),100+300/SIZE+600/SIZE*(J-1):USING$("##",M(I,J))
NEXT I
NEXT J
END SUB

SUB DISPLAY2(X,Y) ! 矢印表示
SET TEXT HEIGHT 50
SET TEXT BACKGROUND "TRANSPARENT"
FOR I=1 TO SIZE
IF X<100 AND Y>100+600/SIZE*(I-1) AND Y<100+600/SIZE*I THEN
SET TEXT COLOR 2
CALL BOXFULL(0,100+600/SIZE*(I-1),100,100+600/SIZE*I,5)
ELSE
SET TEXT COLOR 4
END IF
PLOT TEXT ,AT 50,100+300/SIZE+600/SIZE*(I-1):"←"
NEXT I
FOR I=1 TO SIZE
IF X>700 AND Y>100+600/SIZE*(I-1) AND Y<100+600/SIZE*I THEN
SET TEXT COLOR 2
CALL BOXFULL(700,100+600/SIZE*(I-1),800,100+600/SIZE*I,5)
ELSE
SET TEXT COLOR 4
END IF
PLOT TEXT ,AT 750,100+300/SIZE+600/SIZE*(I-1):"→"
NEXT I
FOR I=1 TO SIZE
IF Y<100 AND X>100+600/SIZE*(I-1) AND X<100+600/SIZE*I THEN
SET TEXT COLOR 2
CALL BOXFULL(100+600/SIZE*(I-1),0,100+600/SIZE*I,100,5)
ELSE
SET TEXT COLOR 4
END IF
PLOT TEXT ,AT 100+300/SIZE+600/SIZE*(I-1),50:"↑"
NEXT I
FOR I=1 TO SIZE
IF Y>700 AND X>100+600/SIZE*(I-1) AND X<100+600/SIZE*I THEN
SET TEXT COLOR 2
CALL BOXFULL(100+600/SIZE*(I-1),700,100+600/SIZE*I,800,5)
ELSE
SET TEXT COLOR 4
END IF
PLOT TEXT ,AT 100+300/SIZE+600/SIZE*(I-1),750:"↓"
NEXT I
END SUB

SUB ROTATE(N,X,Y) ! 回転
SELECT CASE N
CASE 1 ! LEFT
LET TEMP=M(1,Y)
FOR I=1 TO SIZE-1
LET M(I,Y)=M(I+1,Y)
NEXT I
LET M(SIZE,Y)=TEMP
CASE 2 ! RIGHT
LET TEMP=M(SIZE,Y)
FOR I=SIZE-1 TO 1 STEP -1
LET M(I+1,Y)=M(I,Y)
NEXT I
LET M(1,Y)=TEMP
CASE 3 ! UP
LET TEMP=M(X,1)
FOR I=1 TO SIZE-1
LET M(X,I)=M(X,I+1)
NEXT I
LET M(X,SIZE)=TEMP
CASE 4 ! DOWN
LET TEMP=M(X,SIZE)
FOR I=SIZE-1 TO 1 STEP -1
LET M(X,I+1)=M(X,I)
NEXT I
LET M(X,1)=TEMP
END SELECT
END SUB

FUNCTION CHECK ! 揃ったか?
FOR J=1 TO SIZE
FOR I=1 TO SIZE
IF M(I,J)<>SIZE*(J-1)+I THEN
LET CHECK=0
EXIT FUNCTION
END IF
NEXT I
NEXT J
LET CHECK=1
END FUNCTION
END

EXTERNAL SUB GINIT(XSIZE,YSIZE)
SET BITMAP SIZE XSIZE,YSIZE
SET WINDOW 0,XSIZE-1,YSIZE-1,0
SET POINT STYLE 1
SET COLOR MODE "REGULAR"
FOR I=0 TO 7
SET COLOR MIX(I) BITAND(I,2)/2,BITAND(I,4)/4,BITAND(I,1)
NEXT I
CLEAR
END SUB

EXTERNAL SUB BOXFULL(X1,Y1,X2,Y2,C)
SET AREA COLOR C
PLOT AREA:X1,Y1;X2,Y1;X2,Y2;X1,Y2;X1,Y1
END SUB

arm版Windows11 SHIRAISHI Kazuo

2026/02/15 (Sun) 10:09:28

arm版Windows11で,十進BASIC Ver.7,ver.8 は正しく動作しません。FPU例外(0除算,桁あふれなど)の処理に問題があります。
BASIC generic Ver. 0.9 Win64版はx86_64向けにコンパイルしたものですが,FPU例外を利用しないので,arm版Windows11でも動作します。
ただし,テストが十分とはいえないので,arm版Windows11での動作に疑義を見つけた方は報告をお願いします。
Windowsの仕様は,
「スタート」メニューから「設定」(歯車アイコン)
「システム」
「バージョン情報」
で確認できます。

Re: arm版Windows11 SHIRAISHI Kazuo

2026/02/16 (Mon) 08:45:54

テストプログラムです。
10 OPTION ARITHMETIC NATIVE
20 LET x=0
30 WHEN EXCEPTION IN
40 PRINT 1/x
50 USE
60 PRINT "正常"
70 END WHEN
80 END
Ver.7 をarm版Winows11で実行すると,このテストプログラムでフリーズします。
Ver.8 だとこのテストは通過しますが,複素数モードのサンプルプログラムMU_COSH.BASやMANDELBL.BASを実行するとすべて黒で塗りつぶされてしまいます。
テスト環境は,MAC (Apple Silicon) 上のVrtualBox上のWindows11 Canary です。
実機だと異なる結果になるかもしれません。実機 Windows on arm での動作報告を期待(歓迎)します。

Re: arm版Windows11 SHIRAISHI Kazuo

2026/02/16 (Mon) 20:24:22

MAC (Apple Silicon) 上のVrtualBox上のWindows11 Canaryにおいて,十進BASIC Ver.8(Windows版)で
10 OPTION ARITHMETIC NATIVE
20 LET x=0
30 WHEN EXCEPTION IN
40 PRINT 1/x
50 USE
60 PRINT EXTYPE
70 END WHEN
80 END
を実行すると,結果が1002になります。3001が得られるのが正しいので,Ver.8に対しても,FPU例外のエミュレーションに不具合があるように思います。
ただし,Apple SiliconとWindows機のarmとでは浮動小数点例外の扱いが異なることが原因の可能性もあります。実機版 Windows on arm での動作報告を期待します。

動作報告です。 - Tarosa

2026/02/12 (Thu) 22:27:22

多倍長の勉強中チャットGPTが書いてくれました。

!' ==============================
!' 多倍長階乗(十進BASIC)
!' 有理数モードPRINT FACT(10000)
!' ==============================
OPTION ARITHMETIC NATIVE
LET t0=TIME

LET N = 10000 ! ← 計算したい階乗(200!など)
LET CC = 35663 ! ← 桁数(十分大きく)

DIM P(CC)

!' ─── 初期値:1 ───
MAT P = ZER
LET P(CC) = 1 ! 最下位桁に 1

!' ─── 階乗ループ ───
FOR M = 2 TO N

! 掛け算
FOR I = CC TO 1 STEP -1
LET P(I) = P(I) * M
NEXT I

! 繰り上げ処理
FOR I = CC TO 2 STEP -1
LET CARRY = INT(P(I) / 10)
LET P(I) = P(I) - CARRY * 10
LET P(I-1) = P(I-1) + CARRY
NEXT I

NEXT M

!' ─── 表示 ───
!PRINT STR$(N); "! = ";

LET LEADING = 0
FOR I = 1 TO CC
IF P(I) <> 0 OR LEADING = 1 THEN
PRINT STR$(P(I));
LET LEADING = 1
END IF
NEXT I

PRINT
PRINT TIME-t0;"seconds elapsed."

END

しかし、有理数モードの
!' ===================================
!' 有理数モード 10000階乗(十進BASIC)
!' ===================================
OPTION ARITHMETIC RATIONAL
LET t0=TIME
PRINT FACT(10000)
PRINT TIME-t0;"seconds elapsed."
END

よりも計算結果出力の時間がかかってます。階乗は有理数モードが高速

Re: 動作報告です。 - しばっち

2026/02/15 (Sun) 08:03:13

私も作ってみました。
9桁区切りで計算させ無駄なループを省き高速化してみました。

2進モードで実行してください。

OPTION BASE 0
DIM A(4000)
LET A(0)=1
LET T=TIME
FOR I=2 TO 10000
MAT A=(I)*A
FOR J=0 TO N
IF A(J)>=1000000000 THEN
LET R=INT(A(J)/1000000000)
LET A(J)=A(J)-R*1000000000
LET A(J+1)=A(J+1)+R
IF J+1>N THEN LET N=N+1
END IF
NEXT J
NEXT I
PRINT STR$(A(N));
FOR J=N-1 TO 0 STEP-1
PRINT USING "%%%%%%%%%":A(J);
NEXT J
PRINT
PRINT TIME-T;"秒"
END


階乗の計算には1,2,3,4と順に掛けていけばいいが
Nの階乗は1~N/2までを掛けたものとN/2+1~Nまでを掛けたものとを掛けたものと定義することもできます。(2分割)
更に、1~N/3までを掛けたものとN/3+1~2*N/3までを掛けたものと2*N/3+1~Nまでを掛けたものとを掛けた合わせたものと定義することもできます。(3分割)


また100!を下記のように書いてみた。

100!=(1*3*5*7*9*11*13*15*17*19*21*23*25*27*29*31*33*35*37*39*41*43*45*47*49*51*53*55*57*59*61*63*65*67*69*71*73*75*77*79*81*83*85*87*89*91*93*95*97*99)*
2^25*(1*3*5*7*9*11*13*15*17*19*21*23*25*27*29*31*33*35*37*39*41*43*45*47*49)*
4^13*(1*3*5*7*9*11*13*15*17*19*21*23*25)*
8^6 *(1*3*5*7*9*11)*
16^3 *(1*3*5)*
32^2 *(1*3)*
64^1 *(1)

ペキ乗でまとめていけばもう少し最適化できそうですが、すると素因数分解して求めるのと変わらなくなるのでこのままにしておく。



もし、プログラミングを続けていくなら、ぜひ自作(自前)のライブラリーの
作成を勧めます。ライブラリーがあれば毎回1から作る必要がなくなり
2や3から始められます。
ライブラリーが充実していけば7や8からだって始められます。

他言語ならば他の誰か(又は団体や企業等)が作ったライブラリーをダウンロードしてそれを利用するだけですが
十進BASICにもこの掲示板に豊富なプログラム(ライブラリー)がありますので
過去ログを読みなおすこともお薦めします。

まずプログラムの仕様設計を決めることが必要です。
それにはルーチンの呼び出し方を決めルーチン名や使用する変数や個数、配列変数のサイズを決めます。

そして実際にサブルーチン、関数を作成していきます。

多倍長計算でいえばまず足し算、引き算ルーチンを作ります。
表示ルーチン等も併せて作ります。
次に掛け算、割り算ルーチンを作ります。

ルーチンのバージョンアップ(機能拡張)も行っていきます。
負数に対応させるとか、多倍長整数と多倍長小数の両方に対応させる等です。
バージョンアップに伴い仕様設計も変更していきます。

但し、バージョンアップ(更新)していく場合は、バージョンの新しいものと古いものを使用したルーチンが混在することになりますので
更新作業は慎重に行わないとプログラムが動かなくなったりします。

必要なら検索したり管理する作業用のツールプログラムも作ったりします。


四則計算ができたら次は関数ルーチンです。SIN,COS,SQR,EXP,LOG等を作っていきます。
関数ルーチンを基に円周率πなどを求めたり1/πやSQR(π),π^πなどのその派生する定数値を求めたり
するのもいいかと思います。

また、ルーチンを一般化していくのも大事かと思います。

2乗、3乗ルーチンができたらN乗ルーチンを
平方根、立法根ルーチンができたらN乗根を求めるルーチンを作っていきます。

2次、3次とできればN次に、2階、3階とくればN階に対応させていく。
共通項を見つけ出し変数化していくことは大変な作業かもしれませんが
一般化するのは利用価値がより高いからです。

N乗の次はNを整数から実数へと拡張していきます。
実数の次は複素数に対応させたりします。(複素数の次は4元数か!?)

その為にはアルゴリズムの策定や研究が必要になります。
ネットだけでなく書籍(専門書)も参考にしたりします。

テストプログラムも作り動作検証や研究したりも必要になります。

うまく動かなかったり未完成未完動のプログラムも増えていきますが
消さずに残しておきます。後で完成できるかもしれません。

その次のステージは高速化や高機能多機能化(2変数や多変数対応等)などより高度なプログラムへと移行していきます。

高速化は高度な知識、経験等を必要とする高等テクニックです。
単なる思い付きでできるほど簡単な作業ではありません。

その為には日頃からの情報収集や研究などが大切です。



以上は私事の経験則ですがお役に立てれば幸いに思います。

Re: 動作報告です。 - Tarosa

2026/02/15 (Sun) 23:10:14

しばっちさま毎度お世話になります。

!Google AI例
!10000階乗/123456(十進BASIC)
OPTION BASE 0
DIM A(4000), Q(4000)
LET A(0)=1
LET N=0
LET RADIX = 1000000000

! --- 階乗計算 (A = 10000!) ---
FOR I=2 TO 10000
MAT A=(I)*A
FOR J=0 TO N
IF A(J)>=RADIX THEN
LET R=INT(A(J)/RADIX)
LET A(J)=A(J)-R*RADIX
LET A(J+1)=A(J+1)+R
IF J+1>N THEN LET N=N+1
END IF
NEXT J
NEXT I

! --- 多倍長除算 (Q = A / B) ---
LET B = 123456 ! 除数(割る数)
LET rrem = 0 ! 余り
LET QN = 0 ! 商の最高次
FOR J = N TO 0 STEP -1
! 筆算の考え方:前の桁の余りを10億倍して現在の桁に足す
LET current = rrem * RADIX + A(J)
LET Q(J) = INT(current / B)
LET rrem = MOD(current, B)
IF Q(J) > 0 AND J > QN THEN LET QN = J
NEXT J

! --- 結果表示 ---
PRINT "10000! を "; B; " で割った商の先頭付近:"
PRINT STR$(Q(QN));
FOR J=QN-1 TO MAX(0, QN-5) STEP-1
PRINT RIGHT$("000000000" & STR$(Q(J)), 9);
NEXT J
PRINT "..."
PRINT "余り:"; rrem
END


Google AIの方がチャットさんよりもいい感じです。
しかし、今回も有理数モードの方が高速

!' ===========================================
!' 有理数モード 10000階乗/123456(十進BASIC)
!' ===========================================
OPTION ARITHMETIC RATIONAL
LET t0=TIME
PRINT FACT(10000)/123456
PRINT TIME-t0;"seconds elapsed."
END

私の場合は多倍長はAIが頼りです。しかし、本当は

!チュドノフスキー(Chudnovsky)級数
OPTION ARITHMETIC DECIMAL_HIGH
! (Google AI例: 1000桁モード)

LET t0 = TIME

! 定数の設定
LET C = 640320
LET C3_over_24 = (C^3) / 24 ! 漸化式用の定数
LET S = SQR(C) ! √640320

! 初期値 (k=0 の項)
LET k = 0
LET M = 1 ! 階乗部分の積
LET L = 13591409 ! 分子の 545140134*k + 13591409
LET X = C * S ! 分母の C^(3k+1.5)
LET Z = L / X ! 初項を合計に代入

! ループ計算 (1000桁精度)
FOR k = 1 TO 70 !1回のループで何桁? 精度向上
! 階乗部分の漸化式更新 (factor(6k) / (factor(3k)*factor(k)^3) を更新)
! 前のMに対し、(6k-5)*(6k-4)*(6k-3)*(6k-2)*(6k-1)*(6k) / (k^3 * (3k-2)*(3k-1)*(3k)) を掛けるのに相当
! これを整理すると以下の係数になる
LET M = M * (-(6*k-5)*(2*k-1)*(6*k-1)) / (k^3 * C3_over_24)

LET L = 545140134 * k + 13591409

! 和の更新
LET Z = Z + (M * L) / (C * S)
NEXT k

! 最終計算: 1/pi = 12 * Z
LET my_pi = 1 / (12 * Z)

PRINT my_pi
PRINT PI-my_pi
PRINT TIME - t0; "seconds elapsed."
END

チュドノフスキー(Chudnovsky)級数の円周率を高速に計算する多倍長プログラムをAIに書いてとお願いしていますが、書いてくれません。しばっちさまに2016年10月円周率のプログラムを書いて頂き、今も時々計算結果出力してます。40万桁で約1時間かかります。


Linux版basicとBASファイルの関連付け - 島村1243

2026/02/09 (Mon) 11:54:02

Lubuntu-24.0でLinux(GTK2)版十進BASICの最新版を利用しています。
作成した自作「xxx.BAS」ファイルと実行ファイル「basic」の関連付けについてお尋ねします。

Windows版「十進BASIC.exe」の場合は、作成した自作「xxx.BAS」ファイルをダブルクリックすると「BASIC.exe」が起動し、「xxx.BAS」ファイルを読み込むだけで実行はしません。

ところが、Linux版十進basicの場合は、「xxx.BAS」をダブルクリックすると、「xxx.BAS」を実行してしまいます。
Windows版と同じように読み込むだけにしたい場合は、どのような起動オプションが必要なのか、ご教示頂けると幸いです。

現在、Lubuntu-24.0において以下の様な処理を行っています。
 /home/shima/.local/share/applications/
ディレクトリに
 10BASIC.desktop
という名前のファイルを作成し、そのファイルに下記内容を記入しました。
起動オプションとはExec行の末尾「-OR」の事です。
[Desktop Entry]
Comment=Description of Application
Type=Application
Name=十進BASIC
Icon=/home/shima/apps/basic.png
Exec=/home/shima/apps/BASIC81Ja/basic -OR
StartupNotify=false
Categories=Education;
MimeType=plane-txt/x-basic;

なお、上記載のExec行の起動オプション「-OR」を記述しないと、「xxx.BAS」をダブルクリックしたときにbasicが起動して直後終了してしまうのを防止するために記述していますが、意味はわかりません。

Re: Linux版basicとBASファイルの関連付け SHIRAISHI Kazuo

2026/02/09 (Mon) 15:34:56

-OR open and run
-NR no run
です。
-NRを付加して起動すると,ファイルを開くだけになります。
-ORを付加して起動すると,ファイルを開いて,実行します。

Re: Linux版basicとBASファイルの関連付け - 島村1243

2026/02/10 (Tue) 09:41:51

白石先生、早速にご教示賜り有難うございます。
ご教示頂いたオプション「-NR」を使用したら、目的を達成出来ました!!

ネット検索しても「-OR オプションを使用する。」とのAI回答表示しかなく、途方にくれていました。



タイムアタックゲーム - しばっち

2026/02/08 (Sun) 08:00:53

タイムアタックゲーム(時間感覚を計るゲームです)

単に10秒、20秒、30秒、40秒と順に計るだけです。
スペースキーを押すと始まります。
10秒経ったと思ったら再度スペースキーを押します。

得点の持ち点は100点です。
実時間との誤差分を得点から差し引いていきます。

次は20秒、その次は30秒、最後に40秒を計ります。
誤差が大きいと得点がどんどん減点されます。


CALL GINIT(800,800)
SET TEXT COLOR 7
SET TEXT BACKGROUND "OPAQUE"
SET TEXT JUSTIFY "CENTER","HALF"
DIM T(4)
FOR I=1 TO 4
READ T(I)
LET SCORE=SCORE+T(I)
NEXT I
DATA 10,20,30,40
FOR I=1 TO 4
SET TEXT HEIGHT 60
PLOT TEXT ,AT 400,50:" SCORE:"&STR$(SCORE)&" "
SET TEXT HEIGHT 40
PLOT TEXT ,AT 400,400:" "&STR$(T(I))&"秒後、再度押してください "
PLOT TEXT ,AT 400,600:"HIT SPACE KEY"
DO
LOOP UNTIL GETKEYSTATE(32)<0
DO
LOOP WHILE GETKEYSTATE(32)<0
PLOT TEXT ,AT 400,400:" 只今、"&STR$(T(I))&"秒を計測中です "
PLOT TEXT ,AT 400,600:"HIT SPACE KEY"
LET TI=TIME
DO
LOOP UNTIL GETKEYSTATE(32)<0
PLOT TEXT ,AT 400,400:" "&STR$(ROUND(TIME-TI,2))&"秒でした "
LET S=ROUND(ABS(TIME-TI),2)
WAIT DELAY 1
LET SCORE=SCORE-S
DO
LOOP WHILE GETKEYSTATE(32)<0
NEXT I
PLOT TEXT ,AT 400,50:"SCORE:"&STR$(SCORE)
END

EXTERNAL SUB GINIT(XSIZE,YSIZE)
SET BITMAP SIZE XSIZE,YSIZE
SET WINDOW 0,XSIZE-1,YSIZE-1,0
SET POINT STYLE 1
SET COLOR MODE "REGULAR"
FOR I=0 TO 7
SET COLOR MIX(I) BITAND(I,2)/2,BITAND(I,4)/4,BITAND(I,1)
NEXT I
CLEAR
END SUB

シューティングゲーム - しばっち

2026/02/08 (Sun) 07:59:16

インベーダー風のシューティングゲームです。

4,6キーで移動します。
両サイドから敵が出てきます。
スペースキーでビーム発射です。



DECLARE EXTERNAL FUNCTION STICK
RANDOMIZE
SET TEXT JUSTIFY "CENTER","HALF"
SET TEXT COLOR 7
SET TEXT HEIGHT 20
SET TEXT BACKGROUND "OPAQUE"
LET NUMMAX=4 ! 敵最大数
DIM F(9,7),E(8,8),X(NUMMAX),Y(NUMMAX),XC(NUMMAX),ENEMY(NUMMAX)
DIM XZ(NUMMAX),YZ(NUMMAX),FL(NUMMAX)
DIM EC(8,8),FC(9,7)
LET XSIZE=600
LET YSIZE=600
CALL GINIT(XSIZE,YSIZE)
LET SC=5
FOR J=1 TO 8
FOR I=1 TO 8
READ E(I,J)
NEXT I
NEXT J
FOR J=1 TO 7
FOR I=1 TO 9
READ F(I,J)
NEXT I
NEXT J
DATA 0,0,0,7,7,0,0,0
DATA 0,0,7,7,7,7,0,0
DATA 0,7,7,7,7,7,7,0
DATA 7,7,0,7,7,0,7,7
DATA 7,7,7,7,7,7,7,7
DATA 0,0,7,0,0,7,0,0
DATA 0,7,0,7,7,0,7,0
DATA 7,0,7,0,0,7,0,7

DATA 0,0,0,0,7,0,0,0,0
DATA 0,0,0,0,7,0,0,0,0
DATA 0,0,0,7,0,7,0,0,0
DATA 0,0,7,0,7,0,7,0,0
DATA 7,0,7,0,7,0,7,0,7
DATA 7,7,7,0,7,0,7,7,7
DATA 7,0,0,7,7,7,0,0,7
LET YY=550 ! 自機初期位置
LET XX=XSIZE/2
LET MISS=3 ! 自機数
DO
LET NUM=INT(RND*NUMMAX+1)
FOR I=1 TO NUM
PLOT TEXT ,AT XSIZE/2,10:"SCORE:"&STR$(SCORE)&" 残機:"&STR$(MISS)
IF ENEMY(I)=0 THEN
LET Y(I)=20+INT(YSIZE/8/SC*RND)*5*SC ! 敵位置
IF RND<.5 THEN
LET X(I)=0
LET XC(I)=10 ! 敵向き
ELSE
LET X(I)=XSIZE-1
LET XC(I)=-10
END IF
LET ENEMY(I)=1
END IF
LET S=STICK ! キー入力
SET DRAW MODE HIDDEN
CALL BOX(XX,YY,XX+9*SC,YY+7*SC,0) ! 自機消去
CALL BOX(X(I),Y(I),X(I)+8*SC,Y(I)+8*SC,0) ! 敵消去
IF FL(I)=1 THEN CALL BOX(XZ(I),YZ(I),XZ(I)+3,YZ(I)+15,0) ! 敵の弾消去
IF S=4 THEN LET XX=XX-15 ! 自機移動
IF XX<0 THEN LET XX=0
IF S=6 THEN LET XX=XX+15
IF XX>XSIZE-1-8*SC THEN LET XX=XSIZE-1-8*SC
LET X(I)=X(I)+XC(I) ! 敵移動
MAT PLOT CELLS,IN XX,YY;XX+8*SC,YY+6*SC:F ! 自機表示
MAT PLOT CELLS,IN X(I),Y(I);X(I)+7*SC,Y(I)+7*SC:E ! 敵表示
IF FL(I)=0 AND RND<.5 THEN ! 敵の弾
LET XZ(I)=X(I)+4*SC
LET YZ(I)=Y(I)+8*SC
LET FL(I)=1
END IF
SET DRAW MODE EXPLICIT
IF FL(I)=1 THEN
LET YZ(I)=YZ(I)+15 ! 敵の弾移動
CALL BOX(XZ(I),YZ(I),XZ(I)+3,YZ(I)+15,4) ! 敵の弾移動
END IF
IF S=10 THEN ! スペースキー
LET XS=XX+4*SC
FOR YS=YY TO 20 STEP -20 ! 自機弾の発射
CALL BOX(XS,YY-20,XS+3,YS,2)
CALL BOX(XS,YY-20,XS+3,YS,0)

IF X(I)<XS AND X(I)+7*SC>XS AND Y(I)<YS AND Y(I)+7*SC>YS THEN ! 敵命中
CALL BOX(X(I),Y(I),X(I)+8*SC,Y(I)+8*SC,0)
LET SCORE=SCORE+10
LET ENEMY(I)=0
END IF
NEXT YS
END IF
IF YZ(I)>580 THEN ! 敵の弾
CALL BOX(XZ(I),YZ(I),XZ(I)+3,YZ(I)+15,0)
LET FL(I)=0
END IF
IF XZ(I)<XX AND XZ(I)+3>XX+8*SC AND YZ(I)+15<YY AND YZ(I)+15>YY+7*SC THEN ! 自機命中
CALL BOX(XX,YY,XX+8*SC,YY+7*SC,2)
WAIT DELAY .1
CALL BOX(XX,YY,XX+8*SC,YY+7*SC,0)
LET MISS=MISS-1
LET FL(I)=0
END IF
IF X(I)>XSIZE-1 OR X(I)<-7*SC THEN LET ENEMY(I)=0 ! 敵リセット
NEXT I
LOOP UNTIL MISS=0 ! 全部やられたら
SET TEXT COLOR 2
SET TEXT HEIGHT 40
PLOT TEXT , AT XSIZE/2,YSIZE/2:"GAME OVER"
END

EXTERNAL SUB GINIT(XSIZE,YSIZE)
SET BITMAP SIZE XSIZE,YSIZE
SET WINDOW 0,XSIZE-1,YSIZE-1,0
SET POINT STYLE 1
SET COLOR MODE "REGULAR"
FOR I=0 TO 7
SET COLOR MIX(I) BITAND(I,2)/2,BITAND(I,4)/4,BITAND(I,1)
NEXT I
CLEAR
END SUB

EXTERNAL SUB BOX(X1,Y1,X2,Y2,C)
SET AREA COLOR C
PLOT AREA:X1,Y1;X2,Y1;X2,Y2;X1,Y2;X1,Y1
END SUB

EXTERNAL FUNCTION STICK !'キー入力
LET STICK=-1
IF GETKEYSTATE(37)<0 THEN LET STICK=4
IF GETKEYSTATE(38)<0 THEN LET STICK=8
IF GETKEYSTATE(39)<0 THEN LET STICK=6
IF GETKEYSTATE(40)<0 THEN LET STICK=2
FOR I=48 TO 57
IF GETKEYSTATE(I)<0 THEN
LET STICK=I-48
EXIT FUNCTION
END IF
NEXT I
FOR I=96 TO 105
IF GETKEYSTATE(I)<0 THEN
LET STICK=I-96
EXIT FUNCTION
END IF
NEXT I
IF GETKEYSTATE(32)<0 THEN LET STICK=10
END FUNCTION


Copyright © 1999- FC2, inc All Rights Reserved.