【量子コンピュータ?】寄り道「ベルの不等式と量子スクラッチカード」(15分)を読んで、コーディングしたみたのですが、何が間違っているのでしょうか?
を見て、コーディングしてみたのですが、全然思うような結果になりません。
サンプル数を増やすと、どんどん0に近づいていくんだけど(そりゃそうだ)、サンプル数を減らした方が、2越えは発生するけど、解説の内容と会いません。
以下のコーディングで致命的に変な点があったら、どなたかご教示下さい。
package main
import (
crand "crypto/rand"
"fmt"
"github.com/seehuhn/mt19937"
"math"
"math/big"
"math/rand"
"time"
)
type Scratch_Card struct {
UpperLeft int64
LowerLeft int64
UpperRight int64
LowerRight int64
}
var sc Scratch_Card
func main() {
//計算開始日時
started := time.Now()
//乱数の設定
seed, _ := crand.Int(crand.Reader, big.NewInt(math.MaxInt64))
rng := rand.New(mt19937.New())
rng.Seed(seed.Int64())
for k := 0; k < 1; k++ {
var pattern1_count, pattern2_count, pattern3_count, pattern4_count int64;
var pattern1_sum, pattern2_sum, pattern3_sum, pattern4_sum float64;
var rightCat,rightPattern int64
var leftCat,leftPattern int64
//fmt.Println(sc.UpperLeft,sc.UpperRight)
//fmt.Println(sc.LowerLeft,sc.LowerRight)
//fmt.Println()
for i := 0; i < 400; i++ {
// スクラッチカード1枚を作る
sc.UpperLeft = rng.Int63()%2
sc.LowerLeft = rng.Int63()%2
sc.UpperRight = rng.Int63()%2
sc.LowerRight = rng.Int63()%2
// スクラッチカードの左側を削る
if rng.Int63()%2 == 0 { // 上を削ることになった
leftPattern = 0 // 左上が削られたことのフラグ
leftCat = sc.UpperLeft // 左上のネコがスクラッチから表われる
} else { // 下を削ることになった
leftPattern = 1 // 左下が削られたことのフラグ
leftCat = sc.LowerLeft // 左下のネコがスクラッチから表われる
}
// スクラッチカードの右側を削る
if rng.Int63()%2 == 0 { // 上を削ることになった
rightPattern = 0 // 右上が削られることになったフラグ
rightCat = sc.UpperRight// 右下のネコがスクラッチから表われる
} else { // 下を削ることになった
rightPattern = 1 // 右下が削られることになったフラグ
rightCat = sc.LowerRight// 右下のネコがスクラッチから表われる
}
////////////////////
// ○○
// ××
if leftPattern == 0 && rightPattern == 0 {
pattern1_count += 1 // パターン1の回数の加算
if leftCat == rightCat { // マークが同じ
pattern1_sum += 1
} else { // マークが違う
pattern1_sum -= 1
}
}
// ××
// ○○
if leftPattern == 1 && rightPattern == 1 {
pattern2_count += 1 // パターン2の回数の加算
if leftCat == rightCat { // マークが同じ
pattern2_sum += 1
} else { // マークが違う
pattern2_sum -= 1
}
}
// ×○
// ○×
if leftPattern == 1 && rightPattern == 0 {
pattern3_count += 1 // パターン3の回数の加算
if leftCat == rightCat { // マークが同じ
pattern3_sum += 1
} else { // マークが違う
pattern3_sum -= 1
}
}
// ○×
// ×○
if leftPattern == 0 && rightPattern == 1 {
pattern4_count += 1 // パターン4の回数の加算
if leftCat == rightCat { // マークが同じ
pattern4_sum += 1
} else { // マークが違う
pattern4_sum -= 1
}
}
}
fmt.Println("pattern1_count ", pattern1_count, "pattern1_sum", pattern1_sum)
fmt.Println("pattern2_count ", pattern2_count, "pattern2_sum", pattern2_sum)
fmt.Println("pattern3_count ", pattern3_count, "pattern3_sum", pattern3_sum)
fmt.Println("pattern4_count ", pattern4_count, "pattern4_sum", pattern4_sum)
var pattern1_ave,pattern2_ave,pattern3_ave,pattern4_ave float64
pattern1_ave = pattern1_sum / float64(pattern1_count)
pattern2_ave = pattern2_sum / float64(pattern2_count)
pattern3_ave = pattern3_sum / float64(pattern3_count)
pattern4_ave = pattern4_sum / float64(pattern4_count)
fmt.Println()
fmt.Println("pattern1_ave ", pattern1_ave)
fmt.Println("pattern2_ave ", pattern2_ave)
fmt.Println("pattern3_ave ", pattern3_ave)
fmt.Println("pattern4_ave ", pattern4_ave)
fmt.Println()
}
//計算終了日時から計算開始日時を差し引いて、経過時間を出力
fmt.Println("Elapsed: ", time.Now().Sub(started))
}