2

我确信这很简单,但是我有一个主要的心理障碍,所以我需要一点帮助!

我有一个由 5 个整数组成的数组,该数组已经填充了一些数据。我想将数组的最后 N设置为随机噪声。

[int][int][int][int][int]

eg. set last 40 bits

[unchanged][unchanged][unchanged][24 bits of old data followed 8 bits of randomness][all random]

这在很大程度上与语言无关,但我在 C# 中工作,所以 C# 中的答案加分

4

4 回答 4

3

在 C# 中没有任何位符:

BitArray ba = new BitArray (originalIntArray);
for (int i = startToReplaceFrom; i < endToReplaceTo; i++)
    ba.Set (i, randomValue);
于 2010-04-21T23:33:19.070 回答
1

当您将任何数据与随机数据进行异或时,结果是随机的,因此您可以这样做:

Random random = new Random();
x[x.Length - 2] ^= random.Next(1 << 8);
x[x.Length - 1] = random.Next(1 << 16);
x[x.Length - 1] ^= random.Next(1 << 16) << 16;

对于任何 N 的通用解决方案,您可以使用循环:

for (int i = 0; i < 40; ++i)
{
    x[x.Length - i / 32 - 1] ^= random.Next(2) << (i % 32);
}

请注意,这调用 random 的次数超过了必要的次数,但很简单。

于 2010-04-21T23:23:37.640 回答
0

在伪 Python 中:

N        = 5   # array size
bits     = 40  # for instance
int_bits = 32  # bits in one integer

i = N
while bits > 0:
    value_bits  = min (bits, int_bits)
    bits       -= value_bits
    mask        = (1 << value_bits) - 1

    i -= 1
    array[i] ^= random () & mask
于 2010-04-21T23:26:41.333 回答
0

Int32 是 4 个字节或 32 位。
所以你需要最后一个 int 和额外的 8 位。

int lastEightBitsMask = 0x000F + 1;
随机 rand = new Random();
arr[arr.Length - 1] = rand.Next();
arr[arr.Length - 2] ^= rand.Next(lastEightBitsMask);

说明:
最后一个元素的修改应该很清楚 - 如果您需要最后 40 位,则最后 32 位包含在其中。
其余 8 位的修改以 0x000F + 1 为界,因为 rand.Next 的参数是一个排他的上限,所以生成的随机数不会超过这个值。该数字的其余位将保持不变,因为 1^0 == 1 和 0^0 == 0。

于 2010-04-21T23:40:22.330 回答