func (p *Plan) FindParent(materials material.MaterialSlice) string { seed := time.Now().UnixNano() fmt.Println("Seed:", seed) rand.Seed(seed) // FIXME use own PRNG instance ingredients := make([]Ingredient, 0) for use, amount := range p.Requirements { possibleMaterials := materials.FindByUse(use) remainingAmount := amount for remainingAmount > 0 { randomAmount := rand.Int63n(int64(remainingAmount)) + 1 randomIndex := rand.Int63n(int64(len(possibleMaterials))) randomGrade := rand.Int63n(5) mat := possibleMaterials[randomIndex] ingredient := Ingredient{mat, use, material.GradeIndexToGrade(randomGrade), uint8(randomAmount)} ingredients = append(ingredients, ingredient) remainingAmount -= uint8(randomAmount) } } recipe := &Recipe{p, ingredients} genes := recipe.genome(materials) fmt.Println("Genome:", genes) return genes }