我在相同的修正最小和最大范围内有n值。
// value range
int minValue = 0;
int maxValue = 100;
int valueCount = 3; // number of values
// Example 1
int a = 0;
int b = 0;
int c = 0;
// Example 2
int a = 100;
int b = 100;
int c = 100;
// Example 3
int a = 12;
int b = 80;
int c = 27;
示例1和2显示了这3个值的最小和最大变化,其中示例3显示了一些随机值。
给定最小值和最大值的这3个值的所有变量的可能数量为100 * 100 * 100 = 1.000.000。
因此,如果我定义0代表示例1的变化,并且1.000.000代表示例2的变化。我如何计算代表示例3的值?
或者更好的是,我如何循环所有可能的变化以及如何恢复它们。
for(int i = 0; i <= 1000000; i++)
{
int[] values = GetValues(i, minValue, maxValue, valueCount);
}
所以我正在寻找的东西就像上面的GetValues()方法一样。
答案 0 :(得分:1)
您必须乘以101
,而不是100
,因为您的范围(从0到100)包含101个数字。范围1到100或0到99包含100个数字。
因此,您的最大值不是1000000
,而是1030301
。
要将您的价值存储在long
中(在您的示例中也可以是int
):
long stored = c * 101 * 101 + b * 101 + a;
恢复它:
int restoredA = stored % 101;
int restoredB = stored / 101 % 101;
int restoredC = stored / 101 / 101;
如果你的功能:
int[] GetValues(long stored, int minValue, int maxValue, int valueCount);
{
// TODO: Do some parameter checking.
int[] results = new int[valueCount];
int rangeSize = maxValue - minValue + 1;
for(int i = 0; i < valueCount; i++)
{
results[i] = rangeSize % diff + minValue;
stored = stored / diff;
}
return results;
}
当然,当long
存储了很多值,或者minValue
和maxValue
的范围很大时,它们就不适合。
答案 1 :(得分:1)
当您知道该单元格的内存偏移量时,就像找到n维数组的索引一样。
public static IEnumerable<int> GetValues(long i, int minValue, int maxValue, int valueCount)
{
var range = maxValue - minValue + 1;
for (int j = 0; j < valueCount; j++)
{
yield return (int)(i % range + minValue);
i = i / range;
}
}
正如我在评论中提到的,你提供的例子是错误的。
1030301 变异数量,因为每个项目可以有 101 不同的值(从0到100),并且变体总数为101*101*101 = 11030301
。