我建立了一个强大的逻辑和随机化的keygen,基于部分密钥验证'。我需要通过旋转数组添加另一个随机函数,但我在Stack Overflow找到的所有样本都有不同的需求。
我从数组开始:
int[] q = new int[5];
for (int i = 0; i < q.Length; i++)
{
q[i] = i;
}
现在我有:
q[0] = 0;
q[1] = 1;
q[2] = 2;
q[3] = 3;
q[4] = 4;
我需要顺时针方向,但我需要保持一个值不可变,例如q [2] = 2;
然后应该产生第一步(顺时针加上+ 1):
q[0] = 1;
q[1] = 3; //bypassed 2nd value
q[2] = 2;
q[3] = 4;
q[4] = 0; //come back to 0
第二步应该是(顺时针再加+ 1):
q[0] = 3; //bypassed 2nd value
q[1] = 4;
q[2] = 2;
q[3] = 0; //come back to 0
q[4] = 1;
如果可能的话,我还需要回滚功能......非常感谢
感谢您的帮助:同时我创建了我的解决方案:
for (int i = 0; i < q.Length; i++)
{
if (i == fixed_int) { } //donothing
else if ((q[i] + 1) == fixed_int) { q[i] = q[i] + 2; }
else if ((q[i] + 1) == (q.Length + 1)) { q[i] = 0; }
else { q[i] = q[i] + 1; }
}
如果Fix值没有2更多int向前,这将失败,但它不是我的情况。请不要使用此代码,因为它在某些情况下不起作用。使用接受的答案,因为它摇滚!
答案 0 :(得分:0)
假设数组至少包含2个元素,您可以尝试这样的方法(将step
设置为+1
和-1
进行不同的旋转):
void Rotate(int[] a, int fix, int step)
{
int i = (fix + step + a.Length) % a.Length;
int n = (fix - step + a.Length) % a.Length;
int t = a[i];
while(i != n)
{
int j = (i + step + a.Length) % a.Length;
a[i] = a[j];
i = j;
}
a[n] = t;
}
答案 1 :(得分:0)
这是一个可以用来实现结果的通用函数:
public static T[] Rotate<T>(T[] array, int fix)
{
// check for errors
if (array == null) throw new ArgumentNullException("array");
if (fix < 0 || fix > array.Length - 1) throw new IndexOutOfRangeException();
T[] result = new T[array.Length];
// copy the input into the results
Array.Copy(array, 1, result, 0, array.Length - 1);
result[array.Length - 1] = array[0];
// restore the location of the fixed item
int j = ((fix - 1) + array.Length) % array.Length; // index of "fix - 1"
result[j] = result[fix];
result[fix] = array[fix];
return result;
}
以下是随附的回滚功能:
public static T[] Rollback<T>(T[] array, int fix)
{
// check for errors
if (array == null) throw new ArgumentNullException("array");
if (fix < 0 || fix > array.Length - 1) throw new IndexOutOfRangeException();
T[] result = new T[array.Length];
// copy the input into the results
Array.Copy(array, 0, result, 1, array.Length - 1);
result[0] = array[array.Length - 1];
// restore the location of the fixed item
int skp = ((fix + 1) + array.Length) % array.Length;
result[skp] = result[fix];
result[fix] = array[fix];
return result;
}
可以按如下方式使用:
var input = new[] {0, 1, 2, 3, 4};
var result = Rotate(input, 2); // yields {1, 3, 2, 4, 0}
var rollback = Rollback(result, 2); // yields {0, 1, 2, 3, 4}
还要记住,此函数是通用的,因此它可以使用任何类型的数组(在下面用char
数组演示)。
var charArr = "abcdef".ToCharArray();
var charRslt = Rotate(charArr, 3); // {'b', 'c', 'e', 'd', 'f', 'a'}
var charRlbk = Rollback(charRslt, 3); // {'a', 'b', 'c', 'd', 'e', 'f'}