2013-07-17 32 views
5

Tôi muốn viết một chương trình để tạo số ngẫu nhiên bằng cách sử dụng /dev/random trên linux, nhưng sau này tôi thấy thời gian chạy của nó đôi khi không thể chấp nhận được. Phiên bản C của nó chạy nhanh nhất quán.tập tin io với/dev/random mất quá lâu

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

Thời gian thống kê của thời gian chạy

$: 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

"số ngẫu nhiên" không có gì trong toàn bộ Computer-Science-world, giải thích cho mình trong điều khoản tốt hơn – user2485710

+3

'/ dev/random' phụ thuộc vào sự kiện và các sự kiện kiểu phần cứng khác cho dữ liệu. Điều này có nghĩa rằng nó khá ngẫu nhiên, nhưng cũng đôi khi bạn phải chờ đợi (như bạn đã thấy, đôi khi nó là một thời gian dài, bạn phải chờ đợi ngay cả đối với một vài byte). Phiên bản C của bạn có thể sử dụng '/ dev/urandom' thay vì'/dev/random'. – Corbin

+0

@Corbin bài đăng này được gắn thẻ là "C++" ... Tôi vẫn không nhận được điểm ... – user2485710

Trả lời

7

Bạn đã có khả năng thoát nước hồ bơi entropy. Tạo entropy (ok thu hoạch) entropy được dựa trên các trình điều khiển thiết bị mà mẫu phẩm chất của thế giới vật lý mà chủ yếu là không thể đoán trước. Nhưng nếu các thiết bị đó không hoạt động hoặc nếu các thuật toán sản xuất entropy, số đọc của bạn từ /dev/random cũng vậy.

Bạn có thể sử dụng /dev/urandom không? Nếu không, bạn nên nhìn vào những cách mà bạn có thể sản xuất entropy nhiều hơn trong một thời trang quyết định hơn.

Dưới đây là một số gợi ý từ một article regarding a similar problem:

  • Liên quan đến một daemon entropy âm thanh như AED để thu thập tiếng ồn từ trung tâm dữ liệu của bạn với một microphone mở, có thể kết hợp nó với một nhà sưu tập webcam tiếng ồn như VED. Các nguồn khác đang nói về "Ngẫu nhiên mật mã từ sự nhiễu loạn không khí trong các thiết bị đĩa". :)
  • Sử dụng Entropy Gathering Daemon để thu thập entropy yếu hơn từ sự ngẫu nhiên của các chương trình không gian người dùng.
+3

Hơn nữa, một 'std :: ifstream' được đệm theo mặc định, do đó, rất có khả năng mỗi lần chạy chương trình đang cố gắng đọc một vài KB dữ liệu vào bộ đệm tệp, điều này sẽ làm cạn kiệt các đơn đặt hàng của pool entropy nhanh hơn đọc 4 byte cho mỗi lần chạy chương trình. –

+0

@AdamRosenfield Nếu đầu vào C không được đệm như exorbitantly (không chắc OTOH), điều đó có thể giải thích sự khác biệt giữa các ngôn ngữ. – michaelb958

+0

Câu trả lời của IMO @ AdamRosenfield là câu trả lời có khả năng "đúng". 'setbuf (0, 0)' có lẽ là những gì OP muốn. –

Các vấn đề liên quan