Мне нужно было взять массив (C#) целых чисел и случайным образом переназначить значения, чтобы значения «чувствовать» были более рандомизированы без изменения длины или суммы массива. Но этот массив может стать довольно большим, поэтому мне интересно, есть ли у кого-то лучший способ сделать это. В принципе, массив изначально содержит значения, которые примерно равны сумме, деленной на длину, причем один элемент имеет остаток. Сейчас я использую:Есть ли лучший способ добавить энтропию к массиву интов?
static int[] AddEntropy(int[] ia)
{
int elements = ia.Length;
int sum = ia.Sum();
for (int runs = 0; runs < (elements * 2); runs++)
{
Random rnd = new Random(int.Parse(Guid.NewGuid().ToString().Substring(0, 8), System.Globalization.NumberStyles.HexNumber));
int rndi = rnd.Next(0, (sum/elements));
int rnde1 = rnd.Next(0, elements);
int rnde2 = rnd.Next(0, elements);
if (rndi < 1) rndi = 1;
if (ia[rnde1] > (rndi + 2))
{
ia[rnde1] = ia[rnde1] - rndi;
ia[rnde2] = ia[rnde2] + rndi;
}
}
return ia;
}
Любые мысли о том, чтобы сделать это лучше, были бы оценены. Кажется, что он выполняет «хорошо», но если массив больше моего образца из пяти элементов (до 1000 элементов), и есть несколько массивов, которые могут быть быстро изменены, более быстрый вариант будет отличным.
В качестве дополнительной записке, ни один элемент никогда не должен быть равен 0. Кроме того, я использую элементы в качестве ограничителя в течение цикла, так как не нужно работать в 100 раз для массива в пять элементов, но 10 раз для массива из 1000 элементов, скорее всего, не будет рандомизировать слишком много. –
Если у вас есть рабочий код и вы ищете улучшения, [CodeReview] (http://codereview.stackexchange.com/) может быть лучше, чем StackOverflow. – dcastro
Это выглядит немного странным способом создания нового «Случайного». Но я согласен с @dcastro - возможно, лучше спросить об обзоре кода. –