Генерация случайных чисел только с целыми числами, а не с плавающей точкой - PullRequest
0 голосов
/ 24 апреля 2018

Я создал скрипт на python, в котором у меня есть 4 пустых списка, и код создает случайные числа в этих списках, и, в конце концов, сохраняет его как файл Excel.Проблема в том, что он создает числа с плавающей точкой, а я хочу только целые числа!Может ли кто-нибудь мне помочь?

Вот мой код:

import numpy as np
import openpyxl
import random

from openpyxl import Workbook

# Create workbook object
wb = openpyxl.Workbook()
sheet = wb.get_active_sheet()

sheet.title = 'Sheet #1'



# Generate data

Timestamp = [0, 1, 2, 3, 4, 5, 6, 7,8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]

Subtotal_vest = []

Subtotal_NorthEast = []

Subtotal_south = []

Others = []



for i in Timestamp:
    Subtotal_vest.append(random.gauss(3640, 25)),
    Subtotal_NorthEast.append(random.gauss(3832, 25)),
    Subtotal_south.append(random.gauss(2592, 25)),
    Others.append(random.gauss(1216, 25)),







#y = x * x

# Add titles in the first row of each column
sheet.cell(row=1, column=1).value = 'Timestamp'
sheet.cell(row=1, column=2).value = 'Vest'
sheet.cell(row=1, column=3).value = 'North east'
sheet.cell(row=1, column=4).value = 'South'
sheet.cell(row=1, column=5).value = 'Others'

#sheet.cell(row=1, column=2).value = 'Y values'

# Loop to set the value of each cell

for inputs in range(0, len(Timestamp)):
    sheet.cell(row=inputs + 2, column=1).value = Timestamp[inputs]
    sheet.cell(row=inputs + 2, column=2).value = Subtotal_vest[inputs]
    sheet.cell(row=inputs + 2, column=3).value = Subtotal_NorthEast[inputs]
    sheet.cell(row=inputs + 2, column=4).value = Subtotal_south[inputs]
    sheet.cell(row=inputs + 2, column=5).value = Others[inputs]



# Finally, save the file and give it a name
wb.save('Excel/Matrix.xlsx')

Ответы [ 8 ]

0 голосов
/ 24 апреля 2018

Просто выбрасываю это как другую альтернативу.Для произвольного распределения вы можете создать его кумулятивную функцию распределения (CDF) и затем выбрать процентили из этого, взятого из равномерного случайного распределения.Затем вам нужно будет преобразовать их в целые числа, но это дает вам отрисовки из любого дистрибутива, который вы хотите!

from scipy.stats import norm
import matplotlib.pyplot as plt
# Replace `mean` and `std` below with your existing means and standard deviations.
draw = norm.ppf(np.random.random(1000), loc=mean, scale=std)  # 1000 samples, for example
plt.hist(draw.astype(int))

Хорошая особенность этого подхода заключается в том, что он работает для любого дистрибутива, для которого вы можете создатьКОР;даже тот, который вы можете определить только численно из данных!

В качестве альтернативы, вы можете аппроксимировать нормальное распределение с биномиальным распределением, которое является дискретным.В общем, B(n, p) ~ N(n*p, sqrt(n*p*(1-p))):

draw = np.random.binomial(n, p, size=1000)

Вы должны будете найти для n и p исходное среднее значение и стандартное отклонение, установив n*p = mean и sqrt(n*p*(1-p)) = std.

0 голосов
/ 24 апреля 2018

Или же вы можете использовать numpy.random.normal () :

import numpy as np

Timestamp = [0, 1, 2, 3, 4, 5, 6, 7,8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]
timestamps = len(Timestamp)

Subtotal_vest = np.random.normal(3640, 25, timestamps).astype(int)
Subtotal_NorthEast = np.random.normal(3832, 25, timestamps).astype(int)
Subtotal_south = np.random.normal(2592, 25, timestamps).astype(int)
Others = np.random.normal(1216, 25, timestamps).astype(int)
0 голосов
/ 24 апреля 2018

Используйте random.randint(0,10) вместо random.gauss. random.randint () генерирует случайные целочисленные значения.

0 голосов
/ 24 апреля 2018

используйте int (rd.gauss (mu, sigma)).

David

0 голосов
/ 24 апреля 2018

заменить

Subtotal_vest = []

Subtotal_NorthEast = []

Subtotal_south = []

Others = []



for i in Timestamp:
    Subtotal_vest.append(random.gauss(3640, 25)),
    Subtotal_NorthEast.append(random.gauss(3832, 25)),
    Subtotal_south.append(random.gauss(2592, 25)),
    Others.append(random.gauss(1216, 25)),

на

Subtotal_vest = [int(round(random.gauss(3640, 25))) for _ in Timestamp]
Subtotal_NorthEast = [int(round(random.gauss(3832, 25))) for _ in Timestamp]
Subtotal_south = [int(round(random.gauss(2592, 25))) for _ in Timestamp]
Others = [int(round(random.gauss(1216, 25))) for _ in Timestamp]

round округляет до ближайшего целого числа, а затем int преобразовывает число с плавающей точкой в ​​целое число.

0 голосов
/ 24 апреля 2018

Приведение к int возвращает значение random.gauss:

import numpy as np
import openpyxl
import random

from openpyxl import Workbook

# Create workbook object
wb = openpyxl.Workbook()
sheet = wb.get_active_sheet()
sheet.title = 'Sheet #1'

# Generate data
timestamp = [
    0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
    10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
    20, 21, 22, 23
]
subtotal_vest = []
subtotal_north_east = []
subtotal_south = []
others = []

for i in timestamp:
    subtotal_vest.append(int(random.gauss(3640, 25))),
    subtotal_north_east.append(int(random.gauss(3832, 25))),
    subtotal_south.append(int(random.gauss(2592, 25))),
    others.append(int(random.gauss(1216, 25))),


#y = x * x

# Add titles in the first row of each column
sheet.cell(row=1, column=1).value = 'Timestamp'
sheet.cell(row=1, column=2).value = 'Vest'
sheet.cell(row=1, column=3).value = 'North east'
sheet.cell(row=1, column=4).value = 'South'
sheet.cell(row=1, column=5).value = 'Others'

#sheet.cell(row=1, column=2).value = 'Y values'

# Loop to set the value of each cell

for inputs in range(0, len(timestamp)):
    sheet.cell(row=inputs + 2, column=1).value = timestamp[inputs]
    sheet.cell(row=inputs + 2, column=2).value = subtotal_vest[inputs]
    sheet.cell(row=inputs + 2, column=3).value = subtotal_north_east[inputs]
    sheet.cell(row=inputs + 2, column=4).value = subtotal_south[inputs]
    sheet.cell(row=inputs + 2, column=5).value = others[inputs]

# Finally, save the file and give it a name
wb.save('Matrix.xlsx')
0 голосов
/ 24 апреля 2018

Вы пытались использовать int(random.gauss(...))?

0 голосов
/ 24 апреля 2018

Если вы согласны со случайными числами, взятыми из равномерного распределения, вы можете использовать random.randint вместо random.gauss.

...