Thuật toán cho thời tiết ngẫu nhiên


8

Tôi đang có một thời gian khó khăn mô hình thời tiết. Mô hình hóa một khía cạnh duy nhất là tầm thường - một số mô hình hình sin + nhiễu ngẫu nhiên. Tuy nhiên, hơn 1 đang thổi vào tâm trí của tôi. Tôi không thể có gió, lá rơi, mưa và tuyết là ngẫu nhiên. Va chạm đơn giản như mưa và tuyết không bao giờ nên xảy ra.

Trên hết, tôi muốn một mức độ "cường độ" cho mỗi có thể. Nhưng điều này có thể đến sau logic chính.

Thời tiết được lưu trữ trong MySQL.

Tất cả các đề xuất của bạn đều được chào đón, nhưng vui lòng không đề xuất ping một số mã zip và kéo thời tiết từ đó.


Thực tế, sử dụng các đề xuất từ ​​tất cả các câu trả lời bên dưới Tôi đã đưa ra phân phối không theo quy mô này :

Điều chỉnh thời tiết như là một chức năng của tuần trong năm

Mỗi tính năng sẽ được tính toán với một tiếng ồn ngẫu nhiên và sự kết hợp của 3 sẽ tạo ra hiệu ứng lớp phủ.

(nhiệt độ <0) và (ẩm> 65) => tuyết


5
Nhân tiện, tuyết + mưa là một thời tiết hợp lệ.
Kromster

1
Chà, nó sẽ không có trong trò chơi của tôi. :-D
Mikhail

1
Không phải tuyết chỉ là kết quả của mưa + nhiệt độ thấp sao?
Philipp

Câu trả lời:


9

Điều gì về việc chia thời tiết thành các phần chi tiết hơn?

Precipitation - none/light/moderate/heavy
Wind - none/light/moderate/heavy
Type - rain/hail/snow

Bạn vẫn có thể lưu trữ điều này trong một cột SQL duy nhất nếu bạn muốn bằng cách biến nó thành một enum đơn giản với 48 (4 * 4 * 3) giá trị có thể (loại bỏ bất kỳ xung đột lạ nào bạn không thích).


7
Tôi sẽ suy nghĩ về việc phân chia thành "nhiệt độ", "gió" và "độ ẩm". Những điều này sau đó có thể được hiểu là ngụ ý mưa / mưa / tuyết / vv, mà không bao giờ có xung đột.
Trevor Powell

7

Nghe có vẻ như Mô hình Markov ẩn có thể hữu ích cho bạn. Chúng xác định các trạng thái nhất định với xác suất thống kê của các chuyển đổi từ trạng thái này sang trạng thái khác dựa trên tần số tương đối trong các quan sát.

Bạn có thể xác định một số trạng thái thời tiết như 'mưa' và 'nắng' và xác suất chuyển từ mưa sang nắng và nắng sang mưa và tính toán xác suất rằng trời sẽ mưa sớm dựa trên quan sát của bạn nếu trời đang mưa hay mưa . Các bài viết trên Wikipedia giải thích điều này nhưng hướng dẫn này (PDF) cho thấy một cách tiếp cận thực tế hơn.

Nếu bạn mô hình hóa nhiều kiểu thời tiết khác nhau, sẽ khó có thể mô hình hóa chúng một cách độc lập với mẫu này, nhưng bạn có thể xác định thời tiết như 'FogRain' hoặc 'WindSnow' 'SunWind' 'Sun' và có xác suất cho từng loại. Những xác suất này thậm chí có thể được sửa đổi dựa trên tháng trong trò chơi chẳng hạn. Có một vấn đề nhỏ cần lưu ý là mặc dù kích thước của ma trận xác suất của bạn sẽ tăng thêm n ^ 2 khi bạn thêm nhiều loại thời tiết hơn vì mỗi loại cần có xác suất chuyển tiếp (ngay cả khi chúng bằng không) với các loại khác.


Mô hình Markov, không phải HMM.
Peter Taylor

+ 1ed cho đơn giản. Có một cái gì đó đơn giản, có thể điều chỉnh và dễ hiểu là tốt hơn nhiều so với có một cái gì đó chính xác và phức tạp. Ngoài ra, bạn luôn có thể làm cho nó trở nên huyền ảo hơn nếu bạn muốn và làm cho xác suất chuyển tiếp phụ thuộc vào một cái gì đó (độ cao, quần xã sinh vật địa phương, v.v.).
Michael

Mặc dù tôi thích điều này, nhưng nó hơi bất tiện vì các nhà phát triển khác sẽ phải suy nghĩ về việc chuyển đổi trong xác suất. Kết hợp với thực tế là thời tiết phụ thuộc vào thời gian trong năm, mô hình Markov có thể sẽ làm phức tạp mọi thứ
Mikhail

Có lẽ tôi hiểu nhầm đề nghị của bạn. Mỗi tháng tôi phải có một bảng xác suất chuyển tiếp n ^ 2, phải không? Trong đó N là 2 ^ W của mọi điều kiện thời tiết. Do đó, có 3 mô hình thời tiết Tôi có 64 xác suất trong một tháng
Mikhail

@Mikhail cho mỗi tháng bạn sẽ có một bảng xác suất chuyển tiếp từ từng điều kiện thời tiết sang điều kiện khác, nhưng điều này không nhất thiết phải là N ^ 2 về độ phức tạp không gian vì nó không phải là một ma trận (có thể là một cấu trúc đồ thị tuần hoàn với mỗi nhánh trỏ đến một trong các giá trị tiếp theo trong chuỗi có xác suất kèm theo). Không khó để khái niệm, nhưng có lẽ bạn có thể muốn chia nó ra sau mỗi 2-3 tháng thay vì mỗi tháng. Bài viết này tốt hơn bài tôi đã liên kết trước đây, có thể giúp nhiều hơn!
Martin Foot

4

Nói ngắn gọn..

Tôi sẽ suy nghĩ điều này thông qua khoa học.

Như chúng ta đã biết, tuyết là mưa và ngược lại, ngoại trừ chúng có trạng thái rắn khác nhau do thay đổi nhiệt độ.

Thay đổi nhiệt độ có thể được liên kết với gió.

Google nhanh chóng cho "nguyên nhân gây ra gió" đã cho tôi câu trả lời từ Hỏi & Đáp:

"Lực gradient áp suất, phát sinh từ sự nóng lên không đều của bề mặt trái đất. Một khi nó đang chuyển động, lực Coriolis phát sinh từ sự quay của Trái đất để làm chệch hướng nó (ngay ở bán cầu bắc, bên trái ở bán cầu nam)."

Aye, không phải là nguồn tốt nhất cho các câu hỏi khoa học, nhưng nó đưa ra ý tưởng.

Vì vậy, về mặt lý thuyết, bạn chỉ cần gió bây giờ. Nó có thể là ngẫu nhiên, hoặc, cũng có thể được viết theo kịch bản nào đó cho môi trường của bạn nóng lên do một số sự kiện.

Hãy đón gió ngay bây giờ, áp dụng cho vị trí hiện tại của bạn và ngẫu nhiên hoặc thông qua một cách viết kịch bản, tạo ra những đám mây từ đó. Đám mây càng dày thì xác suất và mật độ mưa càng nhiều. Nếu nhiệt độ đủ thấp, mưa sẽ trở thành tuyết. Di chuyển đám mây xung quanh và làm cho nó "không quá dày đặc" với cơn gió đó.

Đối với màn hình, điều đó tùy thuộc vào bạn, chỉ cần lưu trữ trạng thái của các hạt rơi if rain -> use water drop textureif snow -> use snowflake texture. Sử dụng gió để làm cho các hạt này di chuyển theo hướng gió (vâng, bạn cũng nên lưu trữ hạt này, ở đâu đó) để làm cho nó thực tế hơn một chút.

Và với điều này, bạn có thể mở rộng trên tất cả mọi thứ. Giống như, nếu có tuyết rơi và những bông tuyết rơi gần một nguồn nhiệt nào đó, hãy thay đổi kết cấu hạt thành mưa một lần nữa.

Rất nhiều khả năng thực sự, đây chỉ là một khái niệm đơn giản.

PS Đối với mưa đá, hãy xem những gì tạo ra chúng, mở rộng khái niệm cho môi trường như vậy.

Chúc bạn vui vẻ, may mắn.

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.