2010-04-21 127 views
2

我確信這很簡單,但是我有一個主要的心理障礙,所以我需要一點幫助!設置陣列中的最後N位

我有一個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#

+1

首先,您必須定義int中位的順序,無論MSB還是LSB優先。 – starblue 2010-04-22 05:29:59

+0

無論本機系統訂單是什麼。也就是說,它可能會在不同的機器上有所不同,我希望能夠處理該問題。 – Martin 2010-04-29 09:28:42

回答

3

在不以C#的任何位復:

BitArray ba = new BitArray (originalIntArray); 
for (int i = startToReplaceFrom; i < endToReplaceTo; i++) 
    ba.Set (i, randomValue); 
+0

啊,有點陣列,當然!我全心全意對付我的脖子,並沒有想到明顯的事情 – Martin 2010-04-21 23:51:53

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

注意,這個調用隨機的次數超過必要,但很簡單。

+0

這只是上面給出的具體示例的解決方案,而不是一般情況?除此之外,我不太明白你在最後一種情況下做了什麼,爲什麼最後一個索引的兩組隨機性? – Martin 2010-04-21 23:27:46

+0

@Martin:首先設置低16位,然後設置高16位。 – 2010-04-21 23:45:46

+0

啊,因爲如果你只是隨機使用了32位,MSB永遠不會設置得益於2s補碼? – Martin 2010-04-21 23:47:26

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 
+0

@Martin:想想,這取決於機器的端點。你最後幾位究竟是什麼意思? – doublep 2010-04-21 23:33:06

+0

哎呀,它是Big Endian – Martin 2010-04-21 23:48:56

0

的Int32爲4個字節或32位。
所以你需要最後一個int和8位額外的。

int lastEightBitsMask = 0x000F + 1;
Random 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.