2016-11-15 6 views
0

У меня есть минимальное значение и максимальное значение, я хотел бы сгенерировать список чисел между ними, чтобы все числа имели равные значения. Есть ли функция numpy или любая функция?генерировать числа между min и max с равными значениями

Пример: GenerateNums (пуск = 1, остановка = 5, НУМС = 10)

Ожидаемые результаты: [1,1,2,2,3,3,4,4,5,5] т.е. каждый число имеет почти равный счет

+0

Является 'nums' всегда кратна' стоп - start' + 1'? – Bathsheba

+0

@ Bathsheba no, nums - это просто количество чисел, которые я хочу. в этом случае сгенерируйте 10 чисел из 1 и 5, так что каждое генерируемое число имеет почти равный счет – Benard

+0

Добро пожаловать обратно в Stack Overflow. Похоже, вы хотите, чтобы мы написали вам какой-то код. Обычно включается код в вопрос. См. [Ask]. –

ответ

3

Принимает «почти равный» по отношению к сердцу - разница между самым распространенным и наименее распространенным числом составляет максимум 1. Нет гарантии, какой номер является режимом.

def gen_nums(start, stop, nums): 
    binsize = (1 + stop - start) * 1.0/nums 
    return map(lambda x: int(start + binsize * x), xrange(nums)) 

gen_nums(1, 5, 10) 
[1, 1, 2, 2, 3, 3, 4, 4, 5, 5] 
+0

спасибо большое! это то, что я искал. К сожалению, я его поддержал! – Benard

0

Для почти равных счетчиков вы можете выбирать из однородного распределения. numpy.random.randint делает это:

>>> import numpy as np 
>>> np.random.randint(low=1, high=6, size=10) 
array([4, 5, 5, 4, 5, 5, 2, 1, 4, 2]) 

Чтобы получить эти значения в отсортированном порядке:

>>> sorted(np.random.randint(low=1, high=6, size=10)) 
[1, 1, 1, 2, 3, 3, 3, 3, 5, 5] 

Этот процесс так же, как бросок костей :) Как вам образец несколько раз, отсчеты каждого значения должны быть очень похожи :

>>> from collections import Counter 
>>> Counter(np.random.randint(low=1, high=6, size=10000)) 
Counter({1: 1978, 2: 1996, 3: 2034, 4: 1982, 5: 2010}) 

Для точности равных подсчетов:

>>> range(1,6) * 2 
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5] 
>>> sorted(range(1,6) * 2) 
[1, 1, 2, 2, 3, 3, 4, 4, 5, 5] 
+0

Я * думаю * OP хочет, чтобы результат был заказан. – Bathsheba

0
def GenerateNums(start=1, stop=5, nums=10): 
    result = [] 
    rep = nums/(stop - start + 1) 
    for i in xraneg(start,stop): 
     for j in range(rep): 
      result.append(i) 

    return result 
1

Существует NumPy функция:

In [3]: np.arange(1,6).repeat(2) 
Out[3]: array([1, 1, 2, 2, 3, 3, 4, 4, 5, 5]) 
0
def GenerateNums(start=0,stop=0,nums=0,result=[]): 
    assert (nums and stop > 0), "ZeroDivisionError" 
    # get repeating value 
    iter_val = int(round(nums/stop)) 
    # go through strt/end and repeat the item on adding 
    [[result.append(x) for __ in range(iter_val)] for x in range(start,stop)] 
    return result  
print (GenerateNums(start=0, stop=5, nums=30)) 

>>> [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4]