Python - генерирует случайное действительное число между диапазонами с размером шага - PullRequest
0 голосов
/ 10 мая 2018

Я использую python-3.x, и я пытаюсь создать начальную популяцию, которая содержит случайные действительные числа от 0 до 1, где эти числа должны быть одним из следующих: 0, 0.33333, 0.666667 или 1

Это означает, что разница между этими числами составляет 0,33333 (1/3).Я пытался изменить этот код разными способами, но им не повезло

import numpy as np
import random
from random import randint
from itertools import product
pop_size = 7
i_length = 2
i_min = 0
i_max = 1
level = 2
step = ((1/((2**level)-1))*(i_max-i_min))

def individual(length, min, max):
    return [ randint(min,max) for x in range(length) ]
def population(count, length, min, max):
    return [ individual(length, min, max) for x in range(count) ]

population = population(pop_size, i_length, i_min, i_max)

##count: the number of individuals in the population
##length: the number of values per individual
##min: the minimum possible value in an individual's list of values
##max: the maximum possible value in an individual's list of values
##this code was taken from :https://lethain.com/genetic-algorithms-cool-name-damn-simple/

Я сделал следующие строки, которые очень хорошо работают для меня:

population2 = np.array(list(product(np.linspace(i_min, i_max, 2**level), repeat=2)))
population3 = [j for j in product(np.arange(i_min, i_max+step, step), repeat=2)]

, но проблема будет перечислять всевозможные значения, которые не то, что я хочу.Я хочу, чтобы случайные числа, где численность населения будет задана

, результат, который я хочу видеть, smailar для (numpy массив или список):

population = [[0, 1],
             [0, 0.3333],
             [0.3333, 1],
             [1, 0.6667],
             [0.3333, 0.6667],
             [0.6667, 0],
             [0.3333, 0.3333]]

имейте в виду:

level = 2

где я могу вычислить значение шага: например,

step = ((1/((2**level)-1))*(i_max-i_min))

, если я изменил level = 2 на level = 3, тогда он больше не будет использовать 0,3333, он изменится на0,1428 1/7), которые я получу разные значения.

Любой совет будет высоко ценится

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Без числа:

from random import randint

def get_population(num, repeats, fraction):
 return [[randint(0, fraction)/fraction for x in range(num)] for i in range(repeats)]

print(get_population(2, 7, 3))

Вывод:

[[0.3333333333333333, 0.0],
 [0.3333333333333333, 1.0],
 [1.0, 0.3333333333333333],
 [0.3333333333333333, 0.0],
 [0.0, 0.3333333333333333],
 [0.3333333333333333, 0.6666666666666666],
 [1.0, 1.0]]

Дробь 7:

print(get_population(2, 7, 7))

Вывод:

[[0.8571428571428571, 0.7142857142857143],
 [0.7142857142857143, 0.14285714285714285], 
 [0.0, 0.7142857142857143], 
 [0.42857142857142855, 0.5714285714285714], 
 [0.42857142857142855, 0.7142857142857143], 
 [1.0, 0.5714285714285714], 
 [1.0, 1.0]]
0 голосов
/ 10 мая 2018
>>> np.random.choice([0, 1/3., 2/3., 1], size=(7,2), replace=True)
array([[0.        , 0.33333333],
       [0.33333333, 0.66666667],
       [0.        , 0.        ],
       [0.66666667, 0.        ],
       [0.33333333, 0.33333333],
       [1.        , 1.        ],
       [0.33333333, 0.33333333]])


>>> i_min = 0
>>> i_max = 1
>>> level = 3
>>> np.random.choice(np.linspace(i_min, i_max, 2**level), size=(7,2), replace=True)
array([[0.28571429, 0.14285714],
       [0.85714286, 0.57142857],
       [0.71428571, 0.42857143],
       [0.71428571, 1.        ],
       [0.14285714, 0.85714286],
       [0.        , 0.        ],
       [1.        , 0.        ]])
...