2010-12-10 17 views
9

Tôi đang tạo một C++ RPG dựa trên văn bản và tôi đang cố gắng tìm ra cách để tính ra lượng sát thương mà kẻ địch đánh bạn. Ý tưởng của tôi là một cái gì đó như thế này.C++ | Tạo một số giả giữa 10-20

Thiệt hại done = randomIntBetween10and20 * enemyLevel

Bằng cách này nó không luôn luôn nhấn cho một khoảng thời gian và từng cho phép có được Strikes Critical (Ví dụ, nếu các hit trên 15 tôi sẽ lớp mà là một Cuộc tấn công nghiêm trọng)

Tôi mới tham gia C++ nên tôi không chắc chắn cách tôi có thể thực hiện việc này, mọi trợ giúp sẽ được đánh giá cao.

+0

là vấn đề của bạn thế hệ các số ngẫu nhiên? Có một cái nhìn ở đây: http://stackoverflow.com/questions/3786389/write-ac-function-that-generates-one-random-number-or-a-pair-of-random-numbers/3786809#3786809 –

+0

Ahhh , Tôi hiểu rồi. Cảm ơn bạn. –

+10

Thật tệ khi tôi đọc RPG lần đầu tiên như Rocket Propelled Grenade? –

Trả lời

26

Bạn nên bỏ qua từ "thực sự" từ tiêu đề, bởi vì bạn có thể không có ý đó. Có thể bạn chỉ muốn có số giả ngẫu nhiên. Thật ngẫu nhiên là hầu như không thể đạt được với một máy tính cá nhân. Đoạn sau đây sẽ cung cấp cho bạn một số giả ngẫu nhiên trong khoảng 10..19 bao gồm:

#include<cstdlib> 
#include<ctime> 

// ... 
srand(time(0)); 
int r = rand() % (20 - 10) + 10; 

Nếu bạn muốn bao gồm 20 trong phạm vi thì đây là một loạt các 11 số:

int r = rand() % (21 - 10) + 10 
+0

Thực ra, đây chính xác là những gì tôi cần. Cảm ơn bạn rất nhiều! –

+0

Ít nhất điều này đề cập đến sự khác biệt. +1 –

+3

Khá nhiều máy tính thực sự có luồng đầu vào ngẫu nhiên dựa trên nhiễu nhiệt, bao gồm cả tính ngẫu nhiên thực sự. Xem http://en.wikipedia.org/wiki/Hardware_random_number_generator –

1

Sử dụng srand() để khởi tạo số ngẫu nhiên:

sand(time(NULL)); 

http://www.cplusplus.com/reference/clibrary/cstdlib/srand/

Sau đó sử dụng rand() chức năng để tạo ra một chuỗi các số ngẫu nhiên.

http://www.cplusplus.com/reference/clibrary/cstdlib/rand/

+1

Không thực sự ngẫu nhiên. –

+2

@Noah Roberts: vì vậy, đối với một game nhập vai, chúng ta có cần phải đi với các RNG mã hóa an toàn không? <_ < –

+2

@ Noah: Đồng ý, nhưng không nên bắt đầu tấn công bằng dao chứ không phải là rìu chiến đấu cấp 5? – John

0

Liên kết này phải giúp bạn tạo ra các số ngẫu nhiên trong phạm vi giới hạn trong C++ http://www.codeguru.com/forum/showthread.php?t=378879

+1

không thực sự ngẫu nhiên. –

+0

@Noah Roberts: trên các hệ thống/thư viện sane, hàm rand() được gắn với một nhóm entropy, nạp với các bit ngẫu nhiên từ môi trường. thích hợp cho đại đa số trường hợp, thậm chí hầu hết các tác vụ mật mã. chắc chắn đủ ngẫu nhiên cho một trò chơi. – Javier

+0

@Javier: Bạn có nghĩa là rand() từ thư viện C, hoặc một số phương pháp ngẫu nhiên khác? –

1

Cách duy nhất để 'tạo' một số thực sự ngẫu nhiên là thông qua sự tương tác với một số yếu tố môi trường đó là ngẫu nhiên. Trang web này cung cấp một dịch vụ nào đó cho bạn: http://www.random.org/

+0

Vui mừng khi thấy mọi người hiểu sự khác biệt giữa các số ngẫu nhiên đúng và giả :) – jopasserat

4

Các stdlib bộ tạo số ngẫu nhiên sẽ là một nơi không quan trọng để bắt đầu:

#include <stdlib.h> 
#include <time.h> 

srand(time(NULL)); // initialize the RNG 
int poll = rand() % 20; // random number between 0 and 19 inclusive 

Cuối cùng, bạn sẽ muốn bắt đầu sử dụng một RNG ngẫu nhiên hơn. Mã hóa trò chơi Hoàn thành có một phong cách khá tốt để giúp bạn bắt đầu.

+1

Không thực sự ngẫu nhiên. –

+8

Lưu ý rằng 'srand' nên được gọi là ** ONCE ** và không bao giờ trở lại! (Không phải mọi lần) –

+0

@Noah: Không RNG thực sự là "thật" ngẫu nhiên. Tất cả chỉ là psuedo ngẫu nhiên. Đối với những gì anh ta hỏi, một trong những lựa chọn đó sẽ là "đủ ngẫu nhiên". –

6

Một lựa chọn tốt sẽ là std::random, trình tạo số ngẫu nhiên được tích hợp sẵn trong C++.

Nếu bạn chưa có hỗ trợ C++ 11, hãy sử dụng boost::random. std::random mới được dựa trên boost::random, vì vậy về cơ bản nó giống nhau. Tài liệu này có một số ví dụ, bao gồm Generating integers in a range.

Một trong các tùy chọn được cung cấp là Mersenne Twister (mt19937), là một trình tạo số giả ngẫu nhiên có mục đích chung tốt.

Giống như hầu hết các đề xuất khác, đây là giả ngẫu nhiên. Để có được sự ngẫu nhiên thực sự khó khăn hơn - nhưng bạn không cần điều đó cho một game nhập vai, phải không?(Đối với các số ngẫu nhiên mã hóa mạnh, hãy xem xét OpenSSL hoặc, trên Windows, CryptoAPI.)

+1

Vâng, tôi không gọi C++ 0x là "phiên bản mới nhất", cho rằng nó chưa phải là C++. –

+0

Meh, đã gần rồi. Làm thế nào về, "phiên bản sắp tới?" Tôi sử dụng 'std :: random' tất cả thời gian trong MSVC và tôi biết' gcc' 4.5 hỗ trợ nó quá. – Nate

2

Như những người khác đã nói, có thể rand() sẽ thực sự đủ cho bạn. Điều quan trọng là hạt giống được sử dụng để khởi tạo trình tạo số ngẫu nhiên giả (gọi đến srand() là hạt giống)

Nhưng hãy cẩn thận, True Chaos không có nghĩa là bạn có cơ hội tạo ra bất kỳ đầu ra ngẫu nhiên nào .

Mười năm trước, tôi đã chơi với âm thanh ngẫu nhiên. Tôi cần một số nguồn hỗn loạn.

Tôi chỉ cho bạn biết những thứ tôi đã lưu giữ và thấy hữu ích. tất nhiên vì chúng cần hạt giống, chúng là hỗn loạn giả.

1/cho số phao hỗn loạn giữa -1 và 1: tính hàm f (x) = cos (exp (x)). exp() phát triển quá nhanh, sau vài lần lặp đi lặp lại thực sự, những gì diễn ra từ cos() là hỗn loạn.

2/baker transform: số hỗn loạn giữa 0 và 1: lấy một số, nhân nó bằng hai, và một lần nữa, khi nó vượt trội hơn 1, trừ một cái gì đó để nó quay trở lại betwen 0 và 1. Nhiều giải thích chính xác hơn The Baker Transform.

Nhưng tôi nghĩ rand() và srand() sẽ làm hài lòng bạn.

Để áp dụng cho phạm vi 10-20, tất nhiên bạn kéo dài/mở rộng phạm vi hỗn loạn (0; 1) hoặc (-1; 1) bằng cách nhân và bù trừ để ouput phù hợp với nhu cầu của bạn. ;-)

2

Phương pháp sử dụng mô-đun (%) không phải là lựa chọn tốt vì phân phối bị tắt. Điều này tốt hơn:

double GetRandom(double Min, double Max) 
{ 
    return ((double(rand())/double(RAND_MAX)) * (Max - Min)) + Min;  
} 

Bạn sẽ cần phải bao gồm algorithm và gieo hạt máy phát điện với srand.

Tất nhiên, nó chỉ là giả ngẫu nhiên. Bạn sẽ không thể có được kết quả thật sự ngẫu nhiên, đặc biệt là với rand.

+0

Điều này có vẻ nghiêm trọng lỗi. Hay chỉ là tôi? Tôi thích nơi bạn đang đi nhưng bạn chưa có. –

+0

@GregS Có gì sai? Tôi sẵn sàng sửa nó, nhưng tôi không chắc vấn đề là gì. – Maxpm

+0

@GregS Đừng bận tâm, tôi đã tìm ra vấn đề. – Maxpm

0

nhìn này ra, nó có thể hữu ích:

// random numbers generation in C++ using builtin functions 
#include <iostream> 

using namespace std; 

#include <iomanip> 

using std::setw; 

#include <cstdlib> // contains function prototype for rand 

int main() 
{ 
// loop 20 times 
for (int counter = 1; counter <= 20; counter++) { 

    // pick random number from 1 to 6 and output it 
    cout << setw(10) << (1 + rand() % 6); 

    // if counter divisible by 5, begin new line of output 
    if (counter % 5 == 0) 
     cout << endl; 

} 

return 0; // indicates successful termination 

} // end main 
Các vấn đề liên quan