信者獲得&洗脳シミュレーションプログラム

信者獲得&洗脳シミュレーションプログラム

package main

import (
	"fmt"
	"math/rand"
)

type person struct {
	number             int     // 番号
	mental_strength    float64 // 勧誘に屈しない強さ
	religious_devotion float64 // 信仰力
	church             int     //教会フラグ
}

var p_array []*person // personの配列2
var (
	p_num = 0
)

func person_create() *person {
	p := new(person)
	p.number = p_num
	p_num++                            // 生成された順番に番号を付けていく
	p.mental_strength = rand.Float64() // 勧誘を断わる強さ
	p.religious_devotion = 0           // 信仰力最初は"0"
	p.church = 0                       // 教会フラグ
	p_array = append(p_array, p)       // 配列に放り込む

	return p
}

func (p *person) person_destroy() {
	for index, v := range p_array {
		if v == p {
			p_array = append(p_array[:index], p_array[index+1:]...)
			break
		}
	}
	p = nil //これでいいのかな? ガーベージコレクションが消してくれる、と聞いているが
}

type agent struct {
	number           int     // 番号
	invitation_power float64 // 勧誘力
}

var a_array []*agent // agentの配列
var (
	a_num = 0
)

func agent_create() *agent {
	a := new(agent)
	a.number = a_num
	a_num++                                       // 生成された順番に番号を付けていく
	a.invitation_power = 0.3 + 0.7*rand.Float64() // 勧誘力
	a_array = append(a_array, a)                  // 配列に放り込む
	return a
}

func (a *agent) agent_destroy() {
	for index, v := range a_array {
		if v == a {
			a_array = append(a_array[:index], a_array[index+1:]...)
			break
		}
	}
	a = nil //これでいいのかな? ガーベージコレクションが消してくれる、と聞いているが
}

func (p *person) meet_agent(a *agent) {
	if p.mental_strength < a.invitation_power {
		p.religious_devotion += a.invitation_power * 0.1 // エージェントの説得によって信仰心が微増
		p.mental_strength -= a.invitation_power * 0.1    // エージェントの説得によって心理障壁が微減
		if p.religious_devotion > 1.0 {
			p.religious_devotion = 1.0
		}
		if p.mental_strength < 0.0 {
			p.mental_strength = 0.0
		}

	}

}

func main() {
	for i := 0; i < 1000; i++ {
		person_create()
	}

	fmt.Println("======p_array=========")

	for _, p := range p_array {
		fmt.Println(p.number, ",", p.mental_strength, ",", p.religious_devotion)
	}

	for i := 0; i < 5; i++ {
		agent_create()
	}

	fmt.Println("======a_array=========")

	for _, a := range a_array {
		fmt.Println(a.number, ",", a.invitation_power)
	}

	for i := 0; i < 365; i++ { // 1年間の勧誘
		for _, p := range p_array {
			//fmt.Println(index, ":", v, v.number, v.mental_strength)
			for _, a := range a_array {
				if rand.Float64() < 0.001 {
					p.meet_agent(a)
				}
			}
		}
	}

	fmt.Println("=====p_array after 365days==========")

	for _, p := range p_array {
		fmt.Println(p.number, ",", p.mental_strength, ",", p.religious_devotion)
	}

	fmt.Println("====count2===========")
	count := 0
	for _, p := range p_array {
		if p.religious_devotion > 0.2 {
			p.church = 1 //教会フラグを"1"に変項
			count++
			fmt.Println(p.religious_devotion)
		}
	}
	fmt.Println(count)

	for i := 0; i < 365; i++ { // 2年目の勧誘
		for _, p := range p_array {
			//fmt.Println(index, ":", v, v.number, v.mental_strength)
			for _, a := range a_array {
				if p.church == 1 && rand.Float64() < 0.005 {
					p.meet_agent(a)
				}
			}
		}
	}

	fmt.Println("=====p_array after 365days x 2==========")

	for _, p := range p_array {
		if p.church == 1 {
			fmt.Println(p.number, ",", p.mental_strength, ",", p.religious_devotion)
		}
	}

}

出力結果(エクセルファイル)  → cult.xlsx

2022/09,江端さんの技術メモ

Posted by ebata