2013-05-25 53 views
6

Trong JavaScript, có thể tạo một số ngẫu nhiên từ một số khác không?Tạo một số ngẫu nhiên từ một số khác

Tôi đang cố triển khai trình tạo số ngẫu nhiên có thể dự đoán được cho một trong các trình tạo địa hình fractal của tôi. Tôi đã biết rằng có thể tạo ra một số ngẫu nhiên bằng cách sử dụng Math.random(), nhưng tôi muốn tạo một trình tạo số ngẫu nhiên để tạo ra chính xác một đầu ra cho mỗi đầu vào. (Ví dụ: predictableRandomGenerator(1) sẽ luôn tạo ra cùng một kết quả, không nhất thiết phải giống với đầu vào.)

Vì vậy, có thể tạo một số ngẫu nhiên từ một số khác, trong đó đầu ra luôn giống nhau cho mỗi đầu vào?

+5

+1 cho câu hỏi mở :) – Bill

+0

[Tôi đã làm một tìm kiếm Google cho câu hỏi này] (https://www.google.com /#output=search&sclient=psy-ab&q=generate+a+random+number+from+another+number&oq=generate+a+random+number+from+another+number&gs_l=hp.3...1535.7376.1.7602.44.30. 0.13.13.0.320.2958.20j8j1j1.30.0 ... 0.0.0..1c.1.12.hp.SBAwn8WM_NM & psj = 1 & bav = on.2, hoặc.r_cp.r_qf. & Bvm = bv.47008514, d.dmg & fp = 5f2a042325b2882d & biw = 1366 & bih = 639) và tôi không tìm thấy bất kỳ kết quả nào có liên quan, vì vậy tôi đã quyết định đăng ở đây. –

+0

Liên quan: [Hàm băm số nguyên nào chấp nhận một khóa băm số nguyên?] (Http://stackoverflow.com/questions/664014/what-integer-hash-function-are-good-that-accepts-an-integer -hash-key) – Blender

Trả lời

6

Bạn có thể sử dụng trình tạo tổng kiểm tra như MD5 hoặc SHA-1 để tạo ra một đầu ra giả ngẫu nhiên cho mỗi đầu vào. SHA-1 sẽ tạo một số ngẫu nhiên từ mỗi chuỗi được nhập dưới dạng đầu vào và mỗi đầu ra sẽ tạo ra chính xác một đầu vào. (Có khả năng là bất kỳ bộ tạo tổng kiểm tra nào khác cũng thích hợp cho mục đích đó, vì máy phát điện tổng kiểm tra tạo ra chính xác một đầu ra cho mỗi đầu vào được nhập vào).

+0

Thông báo lớn ở đây là các thuật toán kiểm tra như MD5 và SHA-1 về cơ bản được thiết kế để * chậm *. Điều bạn thực sự muốn là một thuật toán tạo số giả ngẫu nhiên. Từ khóa ở đây là hạt giống, là thuật ngữ kỹ thuật cho "số bắt đầu" mà bạn tham chiếu. – pauljz

+2

Vui lòng không sử dụng StackOverflow làm blog cá nhân của bạn. Trang web này là để đặt câu hỏi lập trình thực sự, không phải để chia sẻ những phát minh của bạn với thế giới. – georg

+0

@ thg435 Câu hỏi tự trả lời [thực sự được khuyến khích trên Stack Overflow] (http://meta.stackexchange.com/a/12519/177227). –

2

Tôi tin rằng những gì bạn cần được gọi là hàm băm một chiều. thử hex_md5() hoặc hex_sha1().

4

Có, điều đó là có thể. Tuy nhiên, bạn sẽ cần phải viết trình tạo số giả ngẫu nhiên của riêng bạn.

Xem, máy tính không thể tạo số ngẫu nhiên. Tuy nhiên, bạn có thể sử dụng thuật toán tạo chuỗi các số xuất hiện ngẫu nhiên.

Thuật toán này thường được đưa ra một hạt giống và mỗi hạt giống dẫn đến một chuỗi các số ngẫu nhiên khác nhau được tạo bởi thuật toán.

Thuật toán phổ biến nhất là trình tạo số giả ngẫu nhiên tuyến tính, được xác định bởi D. H. Lehmer và được mô tả bởi Donald E. Knuth trong Nghệ thuật lập trình máy tính, Tập 2: Thuật toán bán số, phần 3.2.1.

Để biết thêm thông tin chi tiết tham khảo các chủ đề sau đây: Predict the Seed of Javascript's Math.random

+0

Có thể dễ dàng sử dụng hàm băm hiện có, chẳng hạn như SHA-1, SHA-2 hoặc SHA-3, thay vì bắt đầu từ đầu. –

3

Chắc chắn, làm thế nào về chức năng sắc:

function getMappedRandom(random){ return random; } 

Tôi không chắc chắn lý do tại sao bạn muốn chuyển đổi này, nhưng về tính ngẫu nhiên nó không nhất thiết làm cho nó tốt hơn.

Random Number Generator

+0

Điều này sẽ chỉ trả lại đầu vào là đầu ra. Nó vẫn được coi là giả ngẫu nhiên? –

+1

@AndersonGreen: btw, nếu bạn trung thực, bạn nên chấp nhận điều này. Đây là câu trả lời chính xác và chính xác nhất cho câu hỏi của bạn như đã đặt ra. – georg

+0

@ thg435 Về mặt kỹ thuật, điều này sẽ được coi là một kiểu trình tạo số ngẫu nhiên, nhưng một trình tạo số giả ngẫu nhiên trả về đầu ra của nó như đầu vào có thể sẽ ít hơn "ngẫu nhiên" so với hầu hết các trình tạo số ngẫu nhiên khác. kiểm tra] (http://en.wikipedia.org/wiki/Tests_of_randomness). Có lẽ từ ngữ ban đầu của câu hỏi của tôi là gây hiểu nhầm, vì nó dường như ngụ ý rằng tôi muốn trình tạo số ngẫu nhiên tạo ra đầu vào của nó làm đầu ra. –

0

Nếu bạn cần một PRNG cho một máy phát điện địa hình, sau đó tôi giả sử bạn cần một bộ tạo số ngẫu nhiên hạt giống nhằm tái tạo chuỗi các số giả ngẫu nhiên cho một hạt giống nhất định; Như vậy mỗi hạt giống tạo ra một địa hình riêng biệt, riêng biệt có thể được xây dựng lại sau bằng cách cung cấp cùng một hạt giống.

Điều này có thể làm việc cho bạn:

http://davidbau.com/archives/2010/01/30/random_seeds_coded_hints_and_quintillions.html http://davidbau.com/encode/seedrandom.js

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