LFSR được sử dụng như thế nào trong các ứng dụng thực tế như PRNG?


8

Tôi đang lập trình LFSR (Đăng ký thay đổi phản hồi tuyến tính) trong phần mềm cho mục đích học tập và đã gặp một số hạn chế trong việc sử dụng làm trình tạo số giả ngẫu nhiên (PRNG).

  • Nếu hạt giống có vài bit '1' và một vài lần sử dụng, nó đòi hỏi một "thời gian khởi động" lớn để tạo ra đầu ra rõ ràng ngẫu nhiên, với sự phân phối gần như bằng nhau giữa các lần chạy '1' và '0' hoặc ngắn '0'. Tôi đoán với nhiều thao tác khởi động như vậy sẽ nhanh hơn rất nhiều, nhưng tất cả các bảng được tính toán trước tôi tìm thấy đều cho hai hoặc bốn lần nhấn.
  • Các số liên tiếp có mối tương quan cao, điều này được dự kiến, với điều kiện là nếu bit đầu ra bằng 0 thì số tiếp theo sẽ bằng một nửa so với trước đó. Đối với LFSR 15 bit có vòi [15, 14], việc vẽ một cặp số liên tiếp làm điểm trong một mặt phẳng cho các điểm sau. Một PRNG lý tưởng nên lan rộng những điểm này khắp nơi.

hình ảnh

Tôi biết rằng LFSR được sử dụng làm bộ đếm phần cứng nhanh, nhưng tôi cũng đã thấy nó được sử dụng làm PRNG để tạo ra tiếng ồn trắng. Làm thế nào nó được sử dụng trong các ứng dụng thế giới thực với chất lượng kém như vậy?


Như @rawbrawb chỉ ra, LFSR không tốt cho việc tạo số giả danh. Nếu bạn chỉ sử dụng một phần nội dung của thanh ghi thay đổi (ví dụ 16 bit có ý nghĩa nhỏ nhất trong LFSR có độ dài 32 bit) làm số ngẫu nhiên, vấn đề sẽ tồi tệ hơn nhiều. Xem phần Hỏi & Đáp gần đây trên tiền điện tử.SE để biết thêm thông tin về điều này.
Dilip Sarwate

Câu trả lời:


4

Một nguồn tuyệt vời cho tất cả mọi thứ PRNG là "Trình tự đăng ký thay đổi" của Solomon Golomb. Nó thảo luận về các lớp học và kỹ thuật khác nhau.

Để bắt đầu bằng cách đặt lại tất cả các thanh ghi là một cách. Hoặc một tải song song của một hạt giống là một. Nhưng hãy nhớ rằng một sting của tất cả các số không 'là một trạng thái hợp lệ.

Việc chọn đúng mã rất quan trọng vì không phải mọi thiết lập phản hồi trên thanh ghi thay đổi đều đảm bảo rằng bạn có được chuỗi PRNG tối đa.

Cách bạn vận hành PRNG ảnh hưởng đến hiệu suất của nó.

Đối với thanh ghi 15 bit và tra cứu mã, [15,4] là tối đa như [15,1] nhưng [15,14] không được liệt kê. -> Nguồn- "Các hệ thống và ứng dụng trải phổ" - Robert Dixon 2nd Ed. PGS 94. Cuốn sách này là một tài liệu tham khảo rất tốt về thực hiện.

Nói chung, LFSR làm cho PRNG kém và thực tế chung là chỉ sử dụng các bit thấp hơn. Ngoài ra, bạn có thể tạo hai PRNG có độ dài và mã khác nhau và xor các bit thấp hơn để tạo mã mới. Có lẽ nên sử dụng ít hơn 1/2 chiều dài bit. Vì vậy, một thanh ghi có độ dài 30 và 31 bit và XOR 15 LSB.

NIST có mã thử nghiệm tuyệt vời ở đây . Vì vậy, có, nó hút, cho PRNG.


Nếu bạn có bộ vòi [nbits, a, b, c], một bộ khác tối đa là [nbits, nbits-a, nbits-b, nbits-c]. Theo cách này, cả [15,14] và [15,1] là tối đa.
Bruno Kim

Tùy thuộc vào thiết lập đăng ký của bạn, tất cả không hoặc tất cả đều không hợp lệ. Trong hầu hết mọi thứ tôi làm, all-zero là không hợp lệ, nhưng bạn lưu ý rằng nó là hợp lệ ở trên vì vậy muốn đảm bảo rằng điều này đã được ném ra khỏi đó. ;)
Aaron D. Marasco

Đã thêm các chi tiết về cách để có được hiệu suất tốt hơn. Nhưng nó không làm tốt điều đó. Tôi đã sử dụng những thứ này trong SSDS - bản chất tự tương quan. Tôi đã quên mất chuyện kép.
giữ chỗ

Ý tưởng thú vị, với các LFSR khác nhau của XOR, nhưng tôi đoán các con số vẫn sẽ tương quan. Có lẽ tốt hơn là sử dụng câu trả lời của Tim và thực hiện một chu kỳ đầy đủ trước khi chọn một số khác.
Bruno Kim

@BrunoKim nó không phải là bản gốc, nó tính toán hơn hoặc hiệu quả hơn về diện tích. Độ dài lặp lại cũng sẽ là 2 ^ 30.
giữ chỗ

7

Các số liên tiếp có mối tương quan cao, điều này được dự kiến, với điều kiện là nếu bit đầu ra bằng 0 thì số tiếp theo sẽ bằng một nửa so với trước đó. Đối với LFSR 15 bit có vòi [15, 14], việc vẽ một cặp số liên tiếp làm điểm trong một mặt phẳng cho các điểm sau. Một PRNG lý tưởng nên lan rộng những điểm này khắp nơi.

Nếu bạn muốn tạo số ngẫu nhiên với LFSR 15 bit, bạn không kéo số ngẫu nhiên mới mỗi chu kỳ đồng hồ. Như bạn đã nói vì bạn chỉ thêm một bit mới vào thanh ghi mỗi chu kỳ đồng hồ, giá trị trong chu kỳ NN+1sẽ tương quan rất mạnh. Nếu bạn muốn tạo các giá trị ngẫu nhiên (giả sử bạn có vòi phù hợp), thì bạn chỉ cần kéo một giá trị mới sau mỗi 15 đồng hồ.

Một LFSR chỉ đảm bảo cho bạn một bit ngẫu nhiên mỗi chu kỳ, không phải 15 bit ngẫu nhiên.


1
Tôi đang mã hóa cho số bit tùy ý. Nói chung, nếu tôi muốn một số nguyên ngẫu nhiên (64 bit), tôi nên sử dụng LFSR 128 bit (theo gợi ý rawbrawb) và thực hiện 64 lần lặp trước khi chọn một số? Sẽ không có một số nào đó bị bỏ lỡ và những số khác được chọn nhiều lần hơn dự kiến ​​cho phân phối "thống nhất"?
Bruno Kim

2

Một ví dụ trong thế giới thực có thể được tìm thấy trong Hướng dẫn tham khảo gia đình bộ vi xử lý MPC7450 RISC. 7450 đã sử dụng pRNG cho thay thế L2 và L3 bao gồm 16 chốt có ba thanh ghi dịch chuyển đơn giản với các bit 0 đến 4, bit 5 đến 9 và bit 10 đến 15. Bit 0 đến từ XOR của bit 4 và 15, bit 5 đến từ XOR của bit 4 và 9, và bit 10 đến từ XOR của bit 6 và 15. Cách thay thế trong bộ đệm 8 chiều được chỉ định bởi các bit 4, 9 và 15 cho L2 và bởi các bit 0 , 5 và 10 cho L3. Các bit được dịch chuyển mỗi chu kỳ, nhưng rõ ràng việc thay thế bộ đệm không xảy ra thường xuyên. (Một cơ chế thay thế dựa trên bộ đếm thay thế cũng được cung cấp.)

Điều này đã được công nhận là có khả năng có vấn đề:

Do độ trễ của việc tra cứu bộ đệm L2, có 3 chu kỳ xung nhịp giữa lỗi đọc và phân bổ dòng thay thế. Vì vậy, có thể chọn cùng một cách để thay thế cho hai hoặc thậm chí ba lần đọc sai liên tiếp với thuật toán như mô tả ở trên. Để tránh điều này, thuật toán thực tế so sánh một dòng thay thế được chọn với ba dòng thay thế trước đó. Nếu dòng được chọn khớp với một trong ba dòng trước đó, giá trị của một, hai hoặc ba sẽ tự động được thêm vào giá trị chọn cách thay thế.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.