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

データをランダムデータとXORすると、結果はランダムになるため、次のように実行できます。

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);
}

これは必要以上にランダムに呼び出されますが、単純であることに注意してください。

于 2010-04-21T23:23:37.640 に答える
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ビットがそれに含まれます。
rand.Nextの引数は排他的な上限であるため、残りの8ビットの変更は0x000F + 1によって制限され、生成されるランダムはそれ以下になります。1 ^ 0==1および0^0 == 0であるため、数値の残りのビットは同じままです。

于 2010-04-21T23:40:22.330 に答える
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 に答える