长期存储和恢复变体

时间:2015-12-18 16:36:32

标签: c# .net math logic

我在相同的修正最小和最大范围内有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()方法一样。

2 个答案:

答案 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存储了很多值,或者minValuemaxValue的范围很大时,它们就不适合。

答案 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