Как генерировать случайные числа, которые примерно соответствуют нормальному распределению и в сумме дают определенную сC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как генерировать случайные числа, которые примерно соответствуют нормальному распределению и в сумме дают определенную с

Сообщение Anonymous »

Я пытаюсь сгенерировать случайный набор чисел, которые в сумме дают определенную сумму и определенное максимальное значение, которого могут достичь числа.
Однако каждый подход мне кажется обнаружили какой-то недостаток, который делает его непригодным для использования.
  • Иногда результаты не совпадают с правильной суммой.
  • Иногда случайная генерация каждый раз приводит к одним и тем же числам.
  • Некоторые функции приводят к слишком большому количеству итераций.
Я начинаю думать, что это математически невозможно? Мне интересно, может ли кто-нибудь помочь мне разработать код для этого.
Числа должны соответствовать следующим правилам:
  • числа должны складываться в переменную t.
  • Минимальное значение сгенерированного числа — 1.

    Максимальное значение должно быть переменной m.
  • Сгенерированные числа должны следовать как можно ближе к нормальное распределение, насколько это возможно.
  • Нормальное распределение должно быть сосредоточено на 1.
  • Нормальное распределение должно быть достаточно плоским, чтобы можно было получить примеры каждого числа почти до максимума.
  • Все числа должны быть целыми.
Пример: если t равно 30, а m равно 5, то результат будет:
1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4, 5Другой результат может быть:
1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5
У меня есть функция для этого, но она использует цикл while, которого я бы предпочел избегать, поскольку он часто приводит к слишком большому количеству итераций.

Код: Выделить всё

public static List GenerateNumbers(int t, int m)
{
double mean = 1.0;
double variance = 10.0;
double[] probabilities = new double[m];
double sumProbabilities = 0.0;

for (int i = 1; i  frequencies[i - 1])
{
frequencies[i] = frequencies[i - 1];
}
}

int currentSum = 0;
for (int i = 0; i < m; i++)
{
currentSum += frequencies[i] * (i + 1);
}

int maxIterations = 25000;
int iterationCount = 0;

while (currentSum != t && iterationCount < maxIterations)
{
iterationCount++;
if (currentSum < t)
{
for (int i = 0; i < m; i++)
{
if (frequencies[i] < (i == 0 ? frequencies[0] : frequencies[i - 1]))
{
frequencies[i]++;
currentSum += (i + 1);
break;
}
}
}
else
{
for (int i = m - 1; i >= 0; i--)
{
if (frequencies[i] > 0)
{
frequencies[i]--;
currentSum -= (i + 1);
break;
}
}
}
}

if (iterationCount >= maxIterations)
{
Console.WriteLine("Failed to adjust frequencies to match t within max iterations.");
}

List numbers = new List();
for (int i = 0; i < m; i++)
{
for (int j = 0; j < frequencies[i]; j++)
{
numbers.Add(i + 1);
}
}

System.Random rand = new System.Random();
numbers = numbers.OrderBy(x => rand.Next()).ToList();

return numbers;
}
Как мне это сделать?


Подробнее здесь: https://stackoverflow.com/questions/791 ... on-that-al
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»