有没有更好的方法将熵添加到整数数组?
Is There A Better Way to Add Entropy to Array of Ints?
我需要获取一个 (C#) 整数数组并随机重新分配值以使值 "feel" 更加随机,而不更改数组的长度或总和。但是这个数组可能会变得很大,所以我想知道是否有人有更好的方法来做到这一点。基本上,数组最初包含的值大致是总和除以长度,余数为一个元素。我现在用的是:
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;
}
如有任何改进此性能的想法,我们将不胜感激。它似乎执行 "well",但如果数组大于我的五个元素样本(最多 1000 个元素),并且有几个数组可以快速连续修改,那么更快的选择会很棒。
如果我理解正确,任务需要保留元素的总和。然后不需要初始数组元素值,重要的两件事是元素的总和和元素的数量。
public static int[] GetArray(int sum, int n)
{
if(sum < n)
throw new ArgumentException("sum is lower than n");
Random rnd = new Random();
// reserve 1 for each of the elements
sum -= n;
// generate random weights for every element in sum
int[] w = new int[n];
int sw = 0;
for (int i = 0; i < n; i++)
{
w[i] = rnd.Next(0, 100);
sw += w[i];
}
// generate element values based on their weights
int[] result = new int[n];
int tsum = 0;
int psum = 0;
for (int i = 0; i < n; i++)
{
tsum += w[i] * sum;
result[i] = tsum / sw - psum;
psum += result[i];
}
// restore reserved ones
for (int i = 0; i < n; i++)
result[i]++;
return result;
}
我需要获取一个 (C#) 整数数组并随机重新分配值以使值 "feel" 更加随机,而不更改数组的长度或总和。但是这个数组可能会变得很大,所以我想知道是否有人有更好的方法来做到这一点。基本上,数组最初包含的值大致是总和除以长度,余数为一个元素。我现在用的是:
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;
}
如有任何改进此性能的想法,我们将不胜感激。它似乎执行 "well",但如果数组大于我的五个元素样本(最多 1000 个元素),并且有几个数组可以快速连续修改,那么更快的选择会很棒。
如果我理解正确,任务需要保留元素的总和。然后不需要初始数组元素值,重要的两件事是元素的总和和元素的数量。
public static int[] GetArray(int sum, int n)
{
if(sum < n)
throw new ArgumentException("sum is lower than n");
Random rnd = new Random();
// reserve 1 for each of the elements
sum -= n;
// generate random weights for every element in sum
int[] w = new int[n];
int sw = 0;
for (int i = 0; i < n; i++)
{
w[i] = rnd.Next(0, 100);
sw += w[i];
}
// generate element values based on their weights
int[] result = new int[n];
int tsum = 0;
int psum = 0;
for (int i = 0; i < n; i++)
{
tsum += w[i] * sum;
result[i] = tsum / sw - psum;
psum += result[i];
}
// restore reserved ones
for (int i = 0; i < n; i++)
result[i]++;
return result;
}