17/1/15

Cách khởi tạo số ngẫu nhiên trong C/C++

Khởi tạo số ngẫu nhiên thường được dùng để giảm bớt công đoạn nhập số cho mảng một chiều, ma trận,... Để khởi tạo số ngẫu nhiên ta cần biết đến hàm srand()rand() trong stdlib.h. Trong C++ 2 hàm này có sẵn trong iostream.

Hàm srand
Cú pháp: void srand (unsigned int seed);
Dùng để khởi tạo một số ngẫu nhiên theo một số seed. Số ngẫu nhiên được tạo là pseudo-random, tức là số ngẫu nhiên giả, có thể đoán được số kế tiếp. Mỗi một số seed sẽ cho ra một bộ số random khác nhau.
Để cho mỗi số seed khác nhau người ta thường dùng kèm với unsigned int time(NULL) trong thư viện time.h, hàm time(NULL) trả về số giây đã trôi qua kể từ ngày 1/1/1970.
Hàm srand() thường được gọi trước khi gọi hàm rand().

Hàm rand
Cú pháp: int rand(void);
Trả về một số nguyên random giả trong khoảng từ 0 đến RAND_MAX. Hằng RAND_MAX được định nghĩa trong stdlib.h đảm bảo ít nhất bằng 32767.
Nếu chỉ dùng hàm rand() thì sẽ cho ra những số random giống nhau mỗi lần chạy, vì vậy người ta thường khai báo srand(time(NULL)) trước để kết quả random mỗi lần mỗi khác nhau.

Để lấy số ngẫu nhiên từ 0 đến n, ta sử dụng rand()%(n+1)
Để lấy số ngẫu nhiên từ a đến b, ta sử dụng a + rand()%(b-a+1)

Ví dụ:
Code C:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
{
   int a, b;
   srand(time(NULL));
   printf("a = %d\n", rand()%100); //Ngẫu nhiên từ 0 đến 99
   printf("b = %d\n", 50+rand()%51); // 50 đến 100
   return 0;
}
Bonus thêm một số hàm hay dùng:
Hàm Random từ 0 đến n:
int Random(int n)
{
   return rand()%(n+1);
}

Hàm Random từ a đến b:
int Random(int a, int b)
{
   return a + rand()%(b-a+1);
}

Hàm Random số thực từ 0 đến n:
float Random(float n)
{
   return n*rand()/RAND_MAX;
}

Hàm Random số thực từ a đến b:
float Random(float a, float b)
{
   return a + (b - a)*rand()/RAND_MAX;
}

Hàm Random cho mảng một chiều:
void Random(int *a, int n)
{
   for(int i = 0; i < n; i++)
      a[i] = rand();
}

44 nhận xét:

  1. Nặc danh21:56 10/3/15

    Cho em hỏi muốn tạo số ngẫu nhiên từ 0 đến 1.5 thì làm thế nào ạ

    Trả lờiXóa
    Trả lời
    1. Chào bạn,
      Với yêu cầu như trên thì chắc chắn số ngẫu nhiên cần khởi tạo là số thực. Tuy nhiên hàm rand() chỉ trả về số nguyên từ 0 đến RAND_MAX. Vậy để tạo số thực trong khoảng từ 0 đến 1.5 bạn có thể sử dụng công thức: rand()*1.5 / RAND_MAX.
      Nhớ khai báo đầy đủ thư viện để dùng hằng RAND_MAX và dùng lệnh srand(time(NULL)) trước khi gọi hàm rand() nhé bạn.
      Thân mến!

      Xóa
    2. cho e hỏi muốn tao tên ngẫu nhien thì viet sao ạ

      Xóa
    3. Nặc danh10:25 26/5/18

      Phần mềm trò chơi số ngẫu nhiên : http://123link.pw/XQsr0i

      Xóa
  2. Cho em hỏi muốn lấy số ngẫu nhiên là số âm thì làm như thế nào?

    Trả lờiXóa
    Trả lời
    1. Chỉ đơn giản là thêm dấu trừ vào trước toàn bộ công thức nhé bạn.
      Ví dụ: Lấy số nguyên từ -n đến 0: -(rand()%(n+1))
      Hoặc có thể dùng những hàm mình đã bonus ở trên nhưng lúc gọi bạn thêm dấu trừ vào trước.
      Ví dụ: a = -Random(5); chẳng hạn.
      Thân mến!

      Xóa
  3. vừa số âm và số dương thì làm sao vậy bạn

    Trả lờiXóa
    Trả lời
    1. Đơn giản là sử dụng công thức random từ a đến b: a + rand()%(b-a+1)
      Bạn chọn a là một số âm và b là một số dương nhé.
      Lưu ý: phải chọn sao cho b-a < RAND_MAX nhé, nếu không công thức sẽ không chính xác.
      Thân mến!

      Xóa
  4. e có cái code này ak.giờ e muốn tìm hàng có chứa số 0 liên tiếp nhiều nhất thì phải làm sao ak
    #include
    #include
    #include
    #include
    #include
    void main ()
    {
    int m,n,i,j,a[10][10],temp;
    printf(" So hang n cua ma tran la: ");scanf("%d",&n);
    printf(" So cot m cua ma tran la: ");scanf("%d",&m);
    srand(time(NULL));
    for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
    a[i][j]=rand()%2;
    printf("ma tran ngau nhien la: \n");
    for(i=1;i<=n;i++)
    {
    for(j=1;j<=m;j++)
    printf(" %d",a[i][j]);
    printf("\n");
    }
    for(i=1;i<=n;i++)
    {
    if(a[i]==0)
    printf("\nhang thu %d co nhieu so 0 nhat",i);

    }
    getch();
    }

    Trả lờiXóa
    Trả lời
    1. Ở đây mình chỉ nói ý tưởng và bạn có thể dựa vào ý tưởng này để code.
      Có rất nhiều cách làm, thông dụng nhất là bạn có thể dùng một mảng phụ có n phần tử để đếm số lượng số 0 liên tiếp, sau đó tìm max của mảng phụ và in ra.
      Trong 1 hàng có thể các số 0 liên tiếp nhau nhiều lượt thì bạn dùng biến tạm để đếm cho mỗi lượt và lấy lượt lớn nhất để lưu vào mảng phụ.
      Thân mến!

      Xóa
  5. Nặc danh20:48 7/9/15

    cho e hỏi không trùng nhau làm sao vậy?

    Trả lờiXóa
  6. random tạo phân số ngẫu nhiên

    Trả lờiXóa
  7. p cho mình xin link đầy đủ cái phần Random được k?

    Trả lờiXóa
    Trả lời
    1. Phần thông tin về hàm srand() và rand() bạn có thể tra tại: http://www.cplusplus.com/
      Các công thức random là kinh nghiệm riêng của mình muốn chia sẻ đến mọi người.
      Thân mến.

      Xóa
  8. bạn cho mình hỏi là muốn random 2 phần tử i, j là 0 hoặc 1 thì làm thế nào

    Trả lờiXóa
    Trả lời
    1. Dùng hàm random nguyên từ a đến b nhé bạn.
      i = Random(0,1);
      j = Random(0,1);

      Xóa
    2. ai chỉ mình random ra 1 cau lenh vs chảng hạn có 6 cau len muốn random 3 cau thui thỳ la s

      Xóa
    3. ai chỉ mình random ra 1 cau lenh vs chảng hạn có 6 cau len muốn random 3 cau thui thỳ la s

      Xóa
    4. Câu hỏi của bạn thật là ảo diệu :))) nhưng mà bạn có thể tìm hiểu thêm về con trỏ hàm, cách tạo mảng con trỏ hàm để random trong mảng đó.
      Thân mến!

      Xóa
  9. cho e hỏi ví dụ trong trò 2048 random ra 2 số 2 và 4 thì làm như nào ạ ?

    Trả lờiXóa
    Trả lời
    1. Nếu bạn muốn random ra chỉ có số 2 và 4 thì rất đơn giản.

      Cách 1: Xài hàm Random nguyên từ a đến b đã được bonus trên bài viết
      int n = 2 * Random(1,2);

      Cách 2: Random trên mảng.
      int a[2] = { 2, 4 };
      int n = a[Random(0,1)];

      Thân mến!

      Xóa
  10. bạn ơi minh muốn random ra một chuổi số bất kì.như 1-5 mình có thể biết trước số nào sẽ ra tiếp theo thi làm sao vậy bạn.có thể giúp mình được không

    Trả lờiXóa
  11. bạn ơi minh muốn random ra một chuổi số bất kì.như 1-5 mình có thể biết trước số nào sẽ ra tiếp theo thi làm sao vậy bạn.có thể giúp mình được không

    Trả lờiXóa
  12. Cảm ơn anh nha, nhờ bài viết của anh mà em hiểu ra bao nhiêu kiến thức về khởi tạo số ngẫu nhiên

    Trả lờiXóa
  13. sao mình gọi hàm srand rồi mà số random ra vẫn trùng nhau nhiều? bạn giải thích giúp mình với! thank you!

    Trả lờiXóa
  14. muốn tính tổng của các số mình đã random ra thì làm sao nhỉ ??

    Trả lờiXóa
  15. mình muốn radom ra các số như 1,2 1,5 1,6 thì ntn bạn

    Trả lờiXóa
  16. Nặc danh19:41 8/1/18

    hàm random từ a đến b nhưng muốn trả về chuỗi thì như thế nào ạ

    Trả lờiXóa
    Trả lời
    1. Anh admin oi e mun hoi tro game đường tăng trư bát giới tôn ngộ không ma may game quay e doan the nao de bit chinh xac a giup e dc ko vay e cam on a admin

      Xóa
  17. anh ơi, để khởi tạo dãy nhị phân ngẫu nhiên thì làm sao ạ?em cảm ơn ạ

    Trả lờiXóa
  18. em muoon tao mang 10000 phan tu ngau nhien vao file lam ntn a?

    Trả lờiXóa
  19. làm sao để tăng tốc độ ngẫu nhiên nhỉ!!

    Trả lờiXóa
  20. Cho mình hỏi nếu muốn số ngẫu nhiên có số cuối 0 hoặc 5 thì đặt hàm thế nào.

    Trả lờiXóa
  21. cho e hỏi đoạn code dưới đây, tại sao e thêm hàm srand(time(NULL)) thì các biến a[0] tới a[4] lại giống nhau ạ, còn khi bỉ srand(time(NULL)) thì dc các biến khác nhau@@
    #include
    #include
    #include

    int main()
    {
    int d,i,k,j,a[5];
    for(k=0;k<5;k++)
    {
    //srand(time(NULL));
    a[k]=rand()%200;
    printf("a[%d]=%d \n",k,a[k]);
    }
    printf("in ra a[0] a[1] a[2] a[3] a[4] la: \n %d %d %d %d %d", a[0], a[1], a[2], a[3], a[4]);
    }

    Trả lờiXóa
  22. Nặc danh04:46 29/10/18

    Chaò bạn mình sử dụng hàm này để tạo số từ 0 tới n nhưng khi in ra thì không thấy có số 0 và n, cho mình hỏi cách tạo ra hàm số thực ngẫu nhiên từ 0 tới n có xuất hiện cả 0 và n trong đó, xin cảm ơn.

    float Random(float n)
    {
    return n*rand()/RAND_MAX;
    }

    Trả lờiXóa
  23. Mình có 3 số a=3, b=5, c=6
    Muốn random thì viết như thế nào ah
    Trong khoảng %6 ah

    Trả lờiXóa
  24. Mình có 3 số a=3, b=5, c=6
    Muốn random thì viết như thế nào ah
    Trong khoảng %6 ah
    Như random(3) random (5) random (6) giúp mình viết code với

    Trả lờiXóa
  25. Nặc danh21:19 3/5/20

    Mình muốn random 5 số ngẫu nhiên từ 0 đến 9 vị trí các số có thể trùng nhau thì ntn ạ

    Trả lờiXóa
  26. Nặc danh12:49 1/6/20

    ad ơi ad cho e hỏi là e muốn random in ra 1 danh sách kề của đỉnh bất kì trong đò thị (cài đặt đồ thị bằng danh sách kề thì làm thế nào ạ?e tìm tài liệu trên mạng thì k có ạ.MOng a tl giúp e với :(

    Trả lờiXóa
  27. Muốn tạo random từ 0-999 có thời gian 295 để xuất hiện số nguyên

    Trả lờiXóa
  28. Muốn tạo random ngẫu nhiên trùng nhau từ 0-999 có thời gian 295 để xuất hiện số nguyên

    Trả lờiXóa
  29. Muốn tạo random ngẫu nhiên trùng nhau từ 0-999 có thời gian 295 giây để xuất hiện số nguyên

    Trả lờiXóa
  30. em muốn tạo một mảng với số phần tử n (min = 10 và max = 100) và các phần tử đều là ngẫu nhiên. Hiện tại phần random các phần tử đều ra kết quả tốt, tuy nhiên lúc em xuất mảng thì lại ra giá trị rác, không phải các giá trị đã random được ở trên. Nhờ ad xem giúp ạ, dưới đây là đoạn code của em:
    #include
    #include
    #include

    int main(){
    int a[100];int n; int k; int s; int i;
    srand(time(NULL));
    n = rand()%91 + 10; k = n + 10;
    printf("So phan tu mang la: n = %d\n",n);
    for (i=0;i<n;i++){
    s = rand()%k;
    printf("a[%d] = %d\n",i,s);
    }
    for (i=0;i<n;i++)
    printf("%5d",a[i]);

    return 0;
    }
    Cảm ơn ad nhiều ạ

    Trả lờiXóa