Генерация случайного числа с максимальным, минимальным и средним (средним) значением в Matlab - PullRequest
3 голосов
/ 21 марта 2012

Мне нужно сгенерировать случайные числа со следующими свойствами.

  • Минимальное значение должно быть 1
  • Максимальное значение должно быть 9
  • Среднее (среднее) равно 6,00 (иличто-то еще)
  • Случайное число должно быть только целым (положительным)

Я пробовал несколько синтаксисов, но ничего не работает, например

r=1+8.*rand(100,1);

Это дает мнеслучайное число от 1 до 9, но оно не является целым числом (например, 5.607 или 4.391), и каждый раз, когда я вычисляю среднее значение, оно меняется.

Ответы [ 6 ]

4 голосов
/ 21 марта 2012

Вы можете определить функцию, которая удовлетворяет вашим требованиям, на основе функции randi Matlab.Но будьте осторожны, легко определить функции генераторов случайных чисел, которые не генерируют случайные числа.

Может подойти и другой подход - создать распределение вероятностей в соответствии с вашими требованиями.В этом случае вам нужен вектор из 9 чисел с плавающей запятой, которые в сумме равны 1 и по отдельности выражают вероятность появления i-го целого числа.Например, распределение может быть описано следующим вектором:

[0.1 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1]

Они разбивают интервал [0,1] на 9 частей.Затем возьмите ваш любимый rng, который генерирует числа с плавающей точкой в ​​диапазоне [0,1), и сгенерируйте число, предположим, что оно равно 0,45.Прочтите интервал от 0 до 1, и вы обнаружите, что он находится в 5-м интервале, поэтому верните целое число 5.

Очевидно, я был слишком ленив, чтобы дать вам вектор, который дает 6 каксреднее значение распределения, но это не должно быть слишком сложно для вас, чтобы понять.

2 голосов
/ 21 марта 2012

Вот алгоритм с циклом для достижения требуемого среднего значения xmean (с требуемой точностью xeps) путем преобразования случайного числа из одной половины вектора в другое в соответствии со средним значением на текущей итерации. С моими тестами это достигло среднего значения довольно быстро.

n = 100;
xmean = 6;
xmin = 1;
xmax = 9;
xeps = 0.01;
x = randi([xmin xmax],n,1);
while abs(xmean - mean(x)) >= xeps
    if xmean > mean(x)
        x(find(x < xmean,1)) = randi([xmean xmax]);
    elseif xmean < mean(x)
        x(find(x > xmean,1)) = randi([xmin xmean]);
    end
end

x - это необходимый вам вывод.

2 голосов
/ 21 марта 2012

Вы можете использовать randi, чтобы получить случайные целые числа

1 голос
/ 22 марта 2012

Если распределение не важно, и все, что вас интересует, это среднее значение, то есть особенно простая функция, которая делает это:

function x=myrand
 x=6;
end
1 голос
/ 22 марта 2012

Прежде чем вы сможете создать генератор случайных чисел, вам нужно указать распределение, из которого он должен получать. Вы только частично сделали это: то есть, вы указали, что оно рисует из целых чисел в [1,9], и что у него есть значение, которое вы хотите иметь возможность указывать. Это все еще оставляет бесконечность распределений на выбор. Какие еще свойства вы хотите иметь в вашем дистрибутиве?

Редактировать следующий комментарий: Среднее значение любой конечной выборки из распределения вероятностей - так называемое среднее значение выборки - будет только приближаться к среднему значению распределения. Обойти это невозможно.

При этом самым простым (в смысле максимальной энтропии) распределением по целым числам в области [1,9] является экспоненциальное распределение: то есть

p = @(n,x)(exp(-x*n)./sum(exp(-x*(1:9))));

Параметр x определяет среднее значение распределения. Соответствующее совокупное распределение составляет

c = cumsum(p(1:9,x));

Чтобы извлечь из распределения p, вы можете нарисовать случайное число из [0,1] и найти, в какой подинтервал c оно попадает: то есть,

samp = arrayfun(@(y)find(y<c,1),rand(n,m));

вернет массив целых чисел [n,m], извлеченный из p.

1 голос
/ 21 марта 2012

Вы можете использовать floor для усечения случайных чисел только до целых значений:

r = 1 + floor(9 * rand(100,1));

Получение указанного среднего значения немного сложнее; это зависит от того, какой дистрибутив вы ищите.

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