如果我正確理解問題,第一個隨機數將從8個不同的數字(1到8)中隨機選擇,而每個連續的隨機數將從7種不同的可能性中選擇(1到8除前一個)。因此,您需要將256個值的範圍分爲7種可能性。它甚至不會出來,但這是你能做的最好的。所以,你需要像
public class RandomClass {
public RandomClass(HardwareSource source) {
this.source = source;
first = true;
}
pubic int nextRandom() {
int sourceValue = source.read();
int value;
if (first) {
value = sourceValue % 8 + 1;
prev = value;
} else {
value = sourceValue % 7 + 1;
if (value >= prev) {
value++;
}
prev = value;
first = false;
return value;
}
}
假設在第一次調用生成5.你怎麼稱呼它第二次,value
首先被計算爲從1到7的數字;如果值大於等於5,那麼通過增加它,可能輸出的範圍變爲1,2,3,4,6,7,8。輸出將在這兩個值之間幾乎均勻分佈。由於256不能被7整除,因此分佈並不均勻,對較低的數字會有輕微的偏差。你可以修正它,以便在每次通話中偏差都會改變,甚至在整個序列中都會改變;我相信有一種方法是
value = (sourceValue + countGenerated) % 7 + 1;
您在哪裏跟蹤您生成了多少個數字。
我認爲這比採用輸入模8的解決方案更好,如果數字等於上一個,則加1。這些解決方案將產生prev + 1
,其產生的概率是產生其他數字的兩倍,所以它比所需的偏多。
來源
2017-07-17 00:45:26
ajb
如果我正確理解你,你只用了每8個隨機輸入位中的3個? –
無論哪種方式,如果數值與以前相同,爲什麼不能像X + 1那樣做? –
@OliverCharlesworth X + 1是不是隨機的呢?而且X + RANDOM不會工作,因爲每次只能得到一個鏡頭,而X + RANDOM可能會= X。Tricky。 –