Düzenleme: Yani temelde ne yazmaya çalışıyorum için 1 bitlik bir karma olduğunu double
.
Bir eşlemek istediğiniz double
kadar true
veya false
50/50 şansı. Bunun için bazı rasgele sayılar alır kod yazdım (ben 50/50 sonuç almak yine normal tabloya veriler üzerinde kullanmak istediğiniz sadece bir örnek olarak) , çekler, son bit ve artışlarla y
o 1, ya da eğer n
o takdirde 0.
Ancak, bu kod sürekli olarak% 25 y
ve% 75 ile sonuçlanır n
. Neden 50/50 değil? Ve neden bu kadar garip ama düz (1/3) dağıtım?
public class DoubleToBoolean {
@Test
public void test() {
int y = 0;
int n = 0;
Random r = new Random();
for (int i = 0; i < 1000000; i++) {
double randomValue = r.nextDouble();
long lastBit = Double.doubleToLongBits(randomValue) & 1;
if (lastBit == 1) {
y++;
} else {
n++;
}
}
System.out.println(y + " " + n);
}
}
Örnek çıktı:
250167 749833
doubleValue % 1 > 0.5
, ancak bazı durumlarda görünür düzenler getirebileceğinden çok kaba taneli olur (tüm değerler uzunluk 1 aralığındadır). Eğer bu çok iri taneli ise, muhtemelen daha küçük aralıkları denememiz gerekir doubleValue % 1e-10 > 0.5e-10
mi? İyi evet. Ve sadece son biti bir hash olarak almak double
, bu yaklaşımı sonuna kadar takip ettiğinizde mümkün olan en az modülo ile olan şeydir.
(lastbit & 3) == 0
olsa, garip olduğu gibi çalışır.