Tìm vị trí ngẫu nhiên mục đó là xác định?


7

Tôi đang làm việc trong một trò chơi sidecrolling và tôi muốn tạo một khu rừng làm nền. Tôi muốn nền giống nhau cho mọi người để đảm bảo chất lượng là như nhau. Tôi cũng không có quyền truy cập vào trình tạo số ngẫu nhiên có hạt, vì vậy tôi không thể tìm thấy hạt giống tốt và đi từ đó.

Ý tưởng?


7
Tại sao bạn không có quyền truy cập vào trình tạo số ngẫu nhiên có hạt giống?

Đây là một nhà sản xuất trò chơi giống như chương trình và nó không có :(

4
Nhà sản xuất trò chơi nào không cung cấp trình tạo số ngẫu nhiên có hạt giống? Kỳ dị.

7
Gắn thẻ nó với công cụ bạn đang sử dụng sẽ giúp chúng tôi cụ thể hơn trong các câu trả lời.
Martin Sojka

Câu trả lời:


15

Cách rõ ràng nhất có lẽ là viết một trình tạo số ngẫu nhiên của riêng bạn. Đặc biệt là vì bạn không cần phải đáp ứng bất kỳ tiêu chuẩn đặc biệt cao nào về tính ngẫu nhiên (chỉ thiếu các mẫu rõ ràng có thể nhìn thấy), thật dễ dàng để viết một tiêu chuẩn khá hợp lý trong dưới nửa tá dòng mã.

Bạn có thể thêm một đối số làm cho mật độ đối tượng giống nhau để cải thiện nó nếu cần


3
Thuật toán này tạo ra các bộ số ngẫu nhiên có chất lượng rất tốt (như trong " mật mã" ) và thậm chí sử dụng 0 vì hạt giống của bạn không phá vỡ nó) - nó đã được chuyển sang nhiều ngôn ngữ khác nhau (bao gồm cả nguồn) và nhanh chóng : burtleburtle.net/bob/rand/isaacafa.html
Randolf Richardson

6

Thử cái này. Lặp lại từ số 1 đến n, trong đó n là số cây bạn muốn vẽ. Tính toán một hàm băm trên mỗi số. Sử dụng hàm băm làm đầu vào cho hàm vẽ hoặc định vị các phần tử trong nền. Chẳng hạn, bạn có thể sử dụng 8 bit đầu tiên của hàm băm MD5 128 bit làm phần trăm x, phần tiếp theo là phần trăm y, phần tiếp theo là một tỷ lệ x, v.v. Nếu bạn sử dụng cùng hàm băm và đưa ra các đầu vào giống nhau, mỗi lần bạn chạy nó, bạn sẽ nhận được cùng một đầu ra.

Điều này hoàn toàn nên cung cấp cho cả hai tính ngẫu nhiên tốt và sẽ mang tính quyết định.

Ngoài ra, nếu đây không phải là một câu trả lời tốt, xin vui lòng để lại một bình luận giải thích lý do tại sao.

Chỉ cần nhìn vào wikipedia, phương pháp này có vẻ đầy hứa hẹn:

http://en.wikipedia.org/wiki/Random_number_generation#Computational_methods


Tôi không phải là người hạ thấp nó chỉ đang cố gắng tìm ra nó thôi :)

Cảm ơn. Chỉ cần một chút thất vọng là khó kiếm được 50 điểm để tôi có thể đóng góp ý kiến ​​...

Đây là chi phí khá cao (tính toán hàm băm an toàn cho từng phần tử) cho một cái gì đó sẽ hoạt động tốt với PRNG. (Tôi không đánh giá thấp bạn, chỉ giải thích lý do tại sao tôi không nghĩ đó là giải pháp tốt nhất.)

Đã đồng ý. Có lẽ nó có thể được thực hiện hiệu quả hơn khi sử dụng thuật toán băm nhanh nhưng xấu và thực hiện nó như một luồng bit để không lãng phí bất kỳ?

5

Nếu bạn có quyền truy cập vào bất kỳ loại băm nào (như MD5) hoặc tổng kiểm tra (như CRC32), bạn chỉ có thể băm một chuỗi số.

Nếu không, PRNG đơn giản nhất có lẽ sẽ là Bộ tạo công thức tuyến tính . Nó có một cái tên nghe có vẻ phức tạp, nhưng viết một cái thì cực kỳ đơn giản:

Chọn ba hằng số, m , ac .
Bắt đầu bằng cách đặt x trước cho hạt giống của bạn.
Sau đó, mỗi khi bạn muốn tạo một giá trị mới x tiếp theo , chỉ cần làm

x next = (a * x trước + c) mod m  
x trước = x tiếp theo

Một số lựa chọn tốt cho m , ac có thể được tìm thấy ở đây .


3

Cho rằng một số ngẫu nhiên được tạo hạt về cơ bản chỉ là một bảng tra cứu với hạt giống là phần bù (chỉ số bắt đầu), bạn có thể thiết lập một số đơn giản bằng cách đọc trong tệp số CSV (giá trị được phân tách bằng dấu phẩy).

Miễn là tất cả các trường hợp sử dụng cùng một hạt giống, nó sẽ mang tính quyết định trong khi duy trì giả ngẫu nhiên.



2

Một khả năng là sử dụng một thuật toán gọi là nhiễu đơn giản , được phát minh bởi Ken Perlin (được biết đến với tiếng ồn Perlin). Một đặc điểm hay của tiếng ồn đơn giản (như tiếng ồn Perlin) là nó có thể được lát gạch - tức là chỉ một vùng nhỏ trong khu vực tiềm năng cần được tính toán và điều này có thể được lặp lại trên toàn bộ khu vực mà không có đường nối rõ ràng.

Để hàm nhiễu có thể lặp lại, tức là luôn mang lại cùng một giá trị cho một điểm đầu vào nhất định, độ dốc cần phải giả ngẫu nhiên, không thực sự ngẫu nhiên. Họ cần có đủ biến thể để che giấu thực tế rằng hàm không thực sự ngẫu nhiên, nhưng quá nhiều biến thể sẽ gây ra hành vi không thể đoán trước cho hàm nhiễu

Tiếng ồn Simplex có thể được tạo ra nhanh hơn tiếng ồn Perlin và không yêu cầu trình tạo số ngẫu nhiên. Không phải là tùy tiện để thực hiện chỉ bằng cách biết lý thuyết, nhưng có một số mã nguồn để giúp bạn thực hiện (được tham khảo từ Wikipedia ).

Các tùy chọn khác để tạo ra nhiễu giả ngẫu nhiên là fractals và wavelet .

Trong tình huống của bạn, bạn sẽ sử dụng một trong những kỹ thuật này để tạo ra một loạt dữ liệu theo một chiều, sau đó áp dụng ngưỡng để xác định xem có nên đặt cây ở vị trí đó không.


1

Câu trả lời đơn giản nhất: Làm cho chương trình của bạn tải một tệp có các số được tạo trước trong đó và viết một tiện ích đơn giản để tạo các số ngẫu nhiên (hoặc thuật toán trong mọi trường hợp) để lưu vào tệp đó.

Bằng cách này, bạn có thể tạo các tệp chủ yếu là tốt và điều chỉnh bằng tay các phần còn lại của nó mà không gặp phải vấn đề trong đó mọi hạt giống ngẫu nhiên bạn thử đều có vấn đề với nó.


Tôi nghĩ rằng, cùng với bất kỳ phương pháp tiếp cận nào được đưa ra làm câu trả lời cho việc tạo ra các con số, sẽ là cách dễ nhất để bạn thực hiện trong công cụ sẵn có mà bạn đang sử dụng.
Technomalogical

0

Cách tiếp cận khác:

Sử dụng một mật mã khối để "mã hóa" một chuỗi các số từ 1 đến N, sử dụng một khóa cố định. TEA rất dễ thực hiện và khá nhanh.

Một lợi thế của phương pháp này là nếu bạn không thích chuỗi số "ngẫu nhiên" mà bạn nhận được, bạn có thể thử một khóa mã hóa khác và lấy lại một chuỗi hoàn toàn khác.

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.