2013-07-17 24 views
5

Ben linkin üzerinde /dev/random kullanarak gerçekten rastgele sayı üretmek için bir program yazmak istiyorum, ancak daha sonra çalışma zamanını bazen oldukça kabul edilemez bulabilirsiniz. C versiyonu sürekli olarak hızlı çalışır.dosya io çok uzun sürüyor

#include <iostream> 
#include <fstream> 
using namespace std; 
int main(int argc,char*argv[]) 
{ 
    ifstream random("/dev/random", ios_base::in); 
    int t; 
    random.read(reinterpret_cast<char*>(&t), sizeof(t)); 
    cout << t << endl; 
    random.close(); 
    return 0; 
} 

zaman

Büyük olasılıkla entropi havuzu boşaltılmış olan
$: time ./random 
-1040810404 

real 0m0.004s 
user 0m0.000s 
sys 0m0.000s 

$: time ./random 
-1298913761 

real 0m4.119s 
user 0m0.000s 
sys 0m0.000s 
+0

"Gerçekten rastgele sayı" Bilgisayar-Bilim dünyasında böyle bir şey yok, kendinizi daha iyi şartlarda açıklayın – user2485710

+3

'/ dev/random', veri için ara verilere ve diğer donanım tipi olaylara bağlıdır. Bu, oldukça rasgele olduğu, ancak bazen beklemeniz gerektiği anlamına gelir (gördüğünüz gibi, bazen birkaç bayt için bile beklemeniz gereken uzun bir süre). C sürümünüz büyük olasılıkla '/ dev/random' yerine'/dev/urandom' kullanıyordur. – Corbin

+0

@Corbin bu gönderi "C++" olarak etiketlendi ... Ben hala şu noktayı alamıyorum ... – user2485710

cevap

7

çalışan zamanlı istatistik. (Ok hasadı) entropisi yaratmak, fiziksel dünyanın örnek nitelikleri olan ve çoğunlukla tahmin edilemeyen cihaz sürücülerine dayanmaktadır. Ancak bu cihazlar çok aktif değilse veya entropi üreten algoritma durduğunda, /dev/random'dan gelen okumalarınız da olacaktır.

/dev/urandom kullanıyor musunuz? Eğer değilse, daha deterministik bir biçimde daha fazla entropi üretebilmenizin yollarını araştırmalısınız. İşte

bir article regarding a similar problem bazı öneriler:

  • belki VED gibi bir web kamerası gürültü toplayıcı ile birleştirmek, açık mikrofon ile datacenter gürültü toplamak için AED gibi bir ses entropi cini dahil edin. Diğer kaynaklar “Disk cihazlarında Hava Türbülansından Şifreli Rastlantı” hakkında konuşuyor.
  • Kullanıcı arabirimi programlarının rasgeleliğinden zayıf entropi toplamak için Entropy Toplama Daemonunu kullanın.
+3

Ayrıca, bir "std :: ifstream" varsayılan olarak arabelleğe alınır, bu nedenle programın her bir çalıştırmasının, dosya bloğuna birkaç KB veri okumaya çalışması olasıdır; bu, entropi havuzu okuma büyüklüklerini okumadan daha hızlı bir şekilde boşaltır. Program başına 4 bayt. –

+0

@AdamRosenfield C girişi, fahiş bir şekilde (OTOH'dan emin değil) tamponlanmış değilse, bu, çapraz dil farkını açıklayabilir. – michaelb958

+0

IMO @ AdamRosenfield'ın yanıtı "doğru" yanıttır. 'setbuf (0, 0) 'muhtemelen OP'nin istediği. –

İlgili konular