GAIさんへのお返事です。
> 3組の夫婦(カップル)が丸いテーブルに男女交互に並び、どの人も両側に自分のパートナーでない人である確率を調べたい。
> 全調査をして調べたところ、2/12=1/6=0.1666・・・
> を得た。
2進モードでも、Nが12以上は困難です。
また18以上は、整数域を越えますので有理数モードで計算します。(さらに困難!)
!参考サイト
! http://oeis.org/classic/A059375
! http://oeis.org/classic/A000179
!n= 3, 4, 5, 6, 7, 8, 9, 10,
! 12, 96, 3120, 115200, 5836320, 382072320, 31488549120, 3191834419200, …
LET t0=TIME
FOR N=1 TO 11 !N組
PRINT "N="; N
!パートナーを
! 男 1, 2, 3,…, N
! 女 N+1,N+2,N+3,…,N+N
!とする。
!!DIM A(2*N+1) !並び
DIM A(100) !並び
FOR i=1 TO N !1.2.3.4. … .Nの円順列 ※男を固定する
LET A(2*i-1)=i
NEXT i
LET A(2*N+1)=1
PUBLIC NUMERIC C !場合の数
LET C=0
CALL try(1,N,A) !N人の女を配置する
IF C=0 THEN PRINT "解なし" ELSE PRINT 2*FACT(N)*C;"通り"
PRINT "確率=";C/FACT(N)
NEXT N
PRINT "計算時間=";TIME-t0
END
EXTERNAL SUB try(p,N,A())
FOR i=1 TO N
LET t=i+N !女の番号
FOR j=1 TO p-1 !まだ配置されていないなら
IF t=A(2*j) THEN EXIT FOR
NEXT j
IF j>p-1 THEN
IF t=A(2*p-1)+N OR t=A(2*p+1)+N THEN !両隣がパートナー以外なら
ELSE
LET A(2*p)=t
IF p=N THEN !すべて並ぶ
LET C=C+1 !結果を表示する
!!PRINT "No.";C
!!MAT PRINT A;
ELSE
CALL try(p+1,N,A) !次へ
END IF
END IF
END IF
NEXT i
END SUB
実行結果
N= 1
解なし
確率= 0
N= 2
解なし
確率= 0
N= 3
12 通り
確率= .166666666666667
N= 4
96 通り
確率= 8.33333333333333E-2
N= 5
3120 通り
確率= .108333333333333
N= 6
115200 通り
確率= .111111111111111
N= 7
5836320 通り
確率= .114880952380952
N= 8
382072320 通り
確率= .117509920634921
N= 9
31488549120 通り
確率= .119562940917108
N= 10
3191834419200 通り
確率= .121194885361552
N= 11
390445460697600 通り
確率= .122523373617124