Однако каждый подход мне кажется обнаружили какой-то недостаток, который делает его непригодным для использования.
- Иногда результаты не совпадают с правильной суммой.
- Иногда случайная генерация каждый раз приводит к одним и тем же числам.
- Некоторые функции приводят к слишком большому количеству итераций.
Числа должны соответствовать следующим правилам:
- числа должны складываться в переменную t.
- Минимальное значение сгенерированного числа — 1.
Максимальное значение должно быть переменной m. - Сгенерированные числа должны следовать как можно ближе к нормальное распределение, насколько это возможно.
- Нормальное распределение должно быть сосредоточено на 1.
- Нормальное распределение должно быть достаточно плоским, чтобы можно было получить примеры каждого числа почти до максимума.
- Все числа должны быть целыми.
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