Chuyển đến nội dung chính

Srand Trong C++

Làm sao để sinh số ngẫu nhiên trong C/C++? Hãy cùng Techacademy đi tìm cách để khởi tạo các số ngẫu nhiên sử dụng C/C++ nhé. Mình sẽ hướng dẫn các bạn khởi tạo các số ngẫu nhiên. Không chỉ sinh số nguyên ngẫu nhiên, mình sẽ hướng dẫn tạo 1 số ngẫu nhiên trong C ++ và cả cách phân biệt hàm rand và hàm srand () dùng để sinh số ngẫu nhiên nữa nhé. Các bạn cùng tìm hiểu với mình nhé.

I. Srand C++ Là Gì ?

Hàm srand() trong C

Hàm void srand(unsigned int seed) cung cấp seed cho bộ sinh số ngẫu nhiên được sử dụng bởi hàm rand.

Khai báo hàm srand() trong C

Dưới đây là phần khai báo cho srand() trong C:

void srand(unsigned int seed)

Tham số

seed: là một giá trị nguyên, được sử dụng như là seed bởi giải thuật sinh số ngẫu nhiên.

Trả về giá trị

Hàm này không trả về bất cứ giá trị nào.

Ví dụ

Chương trình C sau minh họa cách sử dụng của srand() trong C:

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

int main()
{
   int i, n;
   time_t t;
   
   n = 5;
   
   /* Khoi tao bo sinh so ngau nhien */
   srand((unsigned) time(&t));

   /* in 5 so ngau nhien trong day tu 0 toi 50 */
   for( i = 0 ; i < n ; i++ ) 
   {
      printf("%d\n", rand() % 50);
   }
   
   return(0);
}

Biên dịch và chạy chương trình C trên sẽ cho kết quả:

Srand C++ Là Gì ?
Srand C++ Là Gì ?

II. Tạo 1 Số Ngẫu Nhiên Trong C++

Để tạo ra các số ngẫu nhiên khác nhau tại tất cả thời điểm chạy code, chúng ta sẽ thêm hàm srand() và truyền vào 1 tham số seed kiểu int. Tham số này đổi thay thì hàm srand() sẽ sinh ra các số khác nhau.

Ví dụ:

srand(123456);

Trong trường hợp này, giá trị a vẫn sẽ không đổi ở các lần chạy do 123456 là một hằng số. Vậy, chúng ta sẽ cần truyền vào một giá trị động chứ không phải giá trị tĩnh 😀

Có một giải pháp tốt nhất là chúng ta sẽ truyền cho seed thời gian hiện tại. Bằng phương pháp sử dụng hàm time() trong thư viện time.h. Hàm time() trả về kiểu time_t nhưng chúng ta có thể convert về int.

srand((int) time(0));

Bằng cách thêm hàm này trước lúc gọi hàm rand(), chúng ta đã có thể sinh số ngẫu nhiên khác nhau.

Một thí dụ cụ thể:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main(){
    int r;
    srand((int)time(0));
    for(int i = 0; i < 5; ++i){
        r = rand();
        printf("Rand %d is %d\n",i, r);
    }    
}

Kết quả chạy thử:

// Lần 1
Rand 0 is 5113
Rand 1 is 26832
Rand 2 is 11368
Rand 3 is 11635
Rand 4 is 20552
 
// Lần 2
Rand 0 is 5168
Rand 1 is 12947
Rand 2 is 20147
Rand 3 is 27496
Rand 4 is 32060

Ok, đã giải quyết được bài toán sinh số ngẫu nhiên cơ bản. Nhưng nếu tôi muốn sinh số ngẫu nhiên trong đoạn [min, max] thì phải làm thế nào?

Tạo 1 Số Ngẫu Nhiên Trong C++
Tạo 1 Số Ngẫu Nhiên Trong C++

III. Tạo Số Ngẫu Nhiên Thay Đổi Theo Thời Gian Trong C++

– Để tạo một số ngẫu nhiêu sau thay đổi khác nhau trong các lần chạy, bạn dùng hàm time (có trong #include<ctime>). Theo như thư viện MSDN (Microsoft Developers Network) đề cập rằng: time trả về số của giây được trôi qua được tính từ nữa đêm (00:00:00), ngày 1, tháng 1, năm 1970 theo UTC . (“The time function returns the number of seconds elapsed since midnight (00:00:00), January 1, 1970, coordinated universal time (UTC), according to the system clock”).

– Các số ngẫu nhiên giả được tạo ra bắt đầu từ thời khắc bạn thiết lập sử dụng hàm srand. Dòng code dưới đây thiết lập điểm bắt đầu của thời gian hiện hành.

srand(time(0));

– Giá trị được trả về từ time là qua srand. Lưu ý rằng số ngẫu nhiên được tạo ra trước lời gọi rand.

Ví dụ với chương trình đầu tiên: chúng ta thêm srand(time(0)) trước lời gọi rand().

// Second example 
#include <iostream> 
#include <cstdlib> 
#include <ctime> 
using namespace std;

int main()
{
    srand(time(0));
    int r0 = rand();
    int r1 = rand();
    int r2 = rand();
    int r3 = rand();
    int r4 = rand();

    cout<< "r0 = "<< r0 << endl;
    cout<< "r1 = "<< r1 << endl;
    cout<< "r2 = "<< r2 << endl;
    cout<< "r3 = "<< r3 << endl;
    cout<< "r4 = "<< r4 << endl;

    system("pause");
    return 0;
}

– Output lần đầu:

Tạo Số Ngẫu Nhiên Thay Đổi Theo Thời Gian Trong C++
Tạo Số Ngẫu Nhiên Thay Đổi Theo Thời Gian Trong C++

– Output lần 2:

Tạo Số Ngẫu Nhiên Thay Đổi Theo Thời Gian Trong C++
Tạo Số Ngẫu Nhiên Thay Đổi Theo Thời Gian Trong C++

– Output lần 3:

Tạo Số Ngẫu Nhiên Thay Đổi Theo Thời Gian Trong C++
Tạo Số Ngẫu Nhiên Thay Đổi Theo Thời Gian Trong C++

IV. Tạo Số Ngẫu Nhiên Với Một Khoảng Xác Định Trong C++

Hai cách dùng trên đều cho kết quả giá trị ngẫu nhiên là những giá trị trong khoảng từ 0 đến RAND_MAX. Để tạo ra một giá trị ngẫu nhiên trong khoảng xác định, sử dụng công thức rand() % (max – min + 1) + min để nhận kết quả trong khoảng từ min đến max.

Ví dụ: random giá trị trong khoảng [3, 50]

#include <cstdlib>
#include <ctime>

int main()
{
   srand(time(NULL)); 
   int res = rand() % (50 - 3 + 1) + 3;
   return 0;
}

 

Tạo Số Ngẫu Nhiên Với Một Khoảng Xác Định Trong C++
Tạo Số Ngẫu Nhiên Với Một Khoảng Xác Định Trong C++

V. Phân Biệt Hàm Rand Và Hàm Srand() Dùng Để Sinh Số Ngẫu Nhiên

Để sinh số nguyên trong lập trình C/C++. Chúng ta có thể sử dụng hàm rand(). Hàm này trả về một số nguyên có kiểu dữ liệu là int

Ví dụ:

#include
#include
 
int main(){
    int r;
    for(int i = 0; i < 5; ++i){
        r = rand();
        printf("Rand %d is %d\n",i, r);
    }    
}

Kết quả chạy thử:

0
1
2
3
4
5
6

 
Rand 0 is 41
Rand 1 is 18467
Rand 2 is 6334
Rand 3 is 26500
Rand 4 is 19169

Tuy nhiên, hàm rand() này sẽ không hề random ra những số mới lúc bạn chạy code ở các lần sau. Nghĩa là, kết quả của code trên ở tất cả lần chạy sẽ đều random ra 5 số giống nhau. Bạn có thể thử chạy đoạn code trên nhiều lần để kiếm chứng.
Vậy làm sao để random các số ngẫu nhiên tại mọi thời điểm? Hãy đọc phần tiếp theo nào.

Sinh số ngẫu nhiên trong C/C++ với srand()

Để tạo ra các số ngẫu nhiên khác nhau tại mọi thời điểm chạy code, chúng ta sẽ thêm hàm srand() và truyền vào 1 tham số seed kiểu int. Tham số này đổi thay thì hàm srand() sẽ sinh ra các số khác nhau.

Ví dụ:

0
1
2

 
srand(123456);

Trong trường hợp này, giá trị a vẫn sẽ không đổi ở các lần chạy do 123456 là một hằng số. Vậy, chúng ta sẽ cần truyền vào một giá trị động chứ không phải giá trị tĩnh

Có một giải pháp tốt nhất là chúng ta sẽ truyền cho seed thời gian hiện tại. Bằng cách sử dụng hàm time() trong thư viện time.h. Hàm time() trả về kiểu time_t nhưng chúng ta có thể convert về int.

0
1
2

 
srand((int) time(0));

Bằng cách thêm hàm này trước khi gọi hàm rand(), chúng ta đã có thể sinh số ngẫu nhiên khác nhau.

Một ví dụ cụ thể:

#include
#include
#include
 
int main(){
    int r;
    srand((int)time(0));
    for(int i = 0; i < 5; ++i){
        r = rand();
        printf("Rand %d is %d\n",i, r);
    }    
}

Kết quả chạy thử:

// Lần 1
Rand 0 is 5113
Rand 1 is 26832
Rand 2 is 11368
Rand 3 is 11635
Rand 4 is 20552
 
// Lần 2
Rand 0 is 5168
Rand 1 is 12947
Rand 2 is 20147
Rand 3 is 27496
Rand 4 is 32060
 

Phân Biệt Hàm Rand Và Hàm Srand() Dùng Để Sinh Số Ngẫu Nhiên
Phân Biệt Hàm Rand Và Hàm Srand() Dùng Để Sinh Số Ngẫu Nhiên

The post Srand Trong C++ first appeared on Techacademy.



source https://techacademy.edu.vn/srand-trong-c/

Nhận xét

Bài đăng phổ biến từ blog này

Vẽ Tam Giác Trong C++

Vẽ tam giác trong C++ là một trong những bài tập lập trình về C++ sử dụng vòng lặp khá hay giúp các bạn luyện tư duy code cũng như cách sử dụng vòng lặp. Dưới đây là một số lời giải các bài tập vẽ tam giác trong C++ I. Vẽ Tam Giác Cân Trong C++ Viết chương trình C++ sử dụng ký tự * để vẽ tam giác vuông cân trong C++.Chúng ta sử dụng hai vòng lặp lồng nhau để giải bài toán này. Lời Giải: #include <stdio.h> #include <stdlib.h> int main() { int n; int q = 0; printf("Chuong trinh nay se in ra tam giac can\n"); printf("Nhap chieu cao tam giac cua ban: \n"); scanf("%d",&n); while (n > 0) { for (int i = 1; i<n; i++) printf("%c", ' '); for (int k = 0; k <= q; k ++) printf("%c", '*'); n -- ; q += 2 ; printf("\n"); } return 0; } II. Vẽ Hình Tam Giác Trong C++ Viết một chương trình in ra hình

Nên học C hay C++ ? Lựa chọn nào tốt hơn

Bạn đang mới học lập trình và đang phân vân nên học lập trình C hay C++ , bài viết dưới đây của Tehcacademy.edu.vn sẽ phần nào giải đáp cho bạn thắc mắc trên.  I. Nên học ngôn ngữ lập trình C hay C++ Nếu bạn đang phân vẫn lựa chọn nên học C hay C++ thì dưới đây là một số ưu điểm và nhược điểm của ngôn ngữ lập trình C và C++. Dựa trên đánh giá này, giúp bạn lựa chọn nên học lập trình C hay C++ 1, Ưu điểm và nhược điểm của ngôn ngữ lập trình C, C++ Dưới đây là một số ưu điểm, nhược điểm của ngôn ngữ c và c++: C, C++ đều có những ưu điểm và nhược điểm riêng + Ngôn ngữ lập trình C Ưu điểm : + Hiệu suất cao Mỗi một ngôn ngữ đều dựa vào khả năng sử dụng bộ nhớ để đánh giá hiệu suất. Đây chính là ưu điểm đầu tiên của C, nó có thể chạy mượt mà trên những hệ thống giới hạn về dung lượng, lý do là vì ngay từ đầu C được thiết kế với mục đích thay thế ASM trong các hệ thống bộ nhớ cực hạn chế thập niên 1960. + Tính linh hoạt Lập trình C có 2 tính linh hoạt và là 2 ưu điểm nổi bật củ

Tìm Phần Tử Xuất Hiện Nhiều Nhất Trong Mảng C++

Tìm phần tử xuất hiện nhiều nhất trong mảng là một vấn đề phổ biến trong lập trình C++. Để giải quyết vấn đề này, bạn có thể sử dụng một số phương pháp khác nhau như sử dụng bảng băm (hash table), sắp xếp mảng và duyệt qua mảng. Cùng techacademy đi tìm hiểu chi tiết chủ đề này ngay bài viết bên dưới đây nhé. I. Tìm Phần Tử Xuất Hiện Nhiều Nhất Trong Mảng C++ Trong lập trình C++, việc tìm ra phần tử xuất hiện nhiều nhất trong một mảng là một vấn đề phổ biến và quan trọng. Điều này thường được thực hiện thông qua việc sử dụng các thuật toán và cấu trúc dữ liệu phù hợp. Chúng ta sẽ thảo luận về cách thực hiện điều này một cách hiệu quả trong ngôn ngữ lập trình C++. 1. Sử dụng Bảng Băm (Hash Map): Một cách phổ biến để giải quyết vấn đề này là sử dụng bảng băm. Chúng ta có thể duyệt qua mảng, đếm số lần xuất hiện của mỗi phần tử và lưu trữ chúng trong một bảng băm. 2. Sắp Xếp và Đếm: Một cách khác là sắp xếp mảng và sau đó duyệt qua mảng để đếm số lần xuất hiện của mỗi phần tử liên ti