1
Phát sinh ngẫu nhiên mảng n phần tử số nguyên trong khoảng k cho trước trong C?
0
Việt Cuponi70 đã đăng:

Mình cần phát sinh ngẫu nhiên một mảng chứa n phần tử, các phần tử nằm trong khoảng từ 0 đến một số k cho trước thì làm sao ạ?

thêm bình luận...
2
xuans2huy490 đã đăng:

Sử dụng hàm rand() kết hợp với srand() được định nghĩa sẵn trong <stdlib.h>.

Lưu ý rand() là một hàm tạo số ngẫu nhiên giả trong C, do đó nó cần một con số nào đó để bắt đầu, nếu con số bắt đầu không thay đổi, hàm rand() cũng sẽ chỉ cho cùng 1 kết quả phát sinh mà thôi, hàm rand() sẽ dựa vào srand() để lấy con số bắt đầu này.

Cho nên, nếu bạn muốn mỗi lần chạy chương trình cho một kết quả phát sinh số ngẫu nhiên khác nhau (lần sau không giống với lần trước đó), bạn phải sử dụng srand() với tham số đầu vào là time(NULL) với mục đích là dùng thời gian làm con số bắt đầu, mà thời gian thì chỉ có một đi không trở lại, do đó sẽ tạo được các số ngẫu nhiên khác nhau.

Sau khi tạo được một số ngẫu nhiên, chỉ cần lấy số đó chia lấy dư với khoảng k, bạn sẽ được một số ngẫu nhiên nằm trong khoảng từ 0 đến k.

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

void initRandomArray(int *A, int n, int k) {
    srand(time(NULL));
    int randNum = 0;
    for (int i = 0; i < n; i++) {
        randNum = rand() % k;
        A[i] = randNum;
    }
}

int main() {
    int *A;
    int n = 10; /* Số lượng phần tử của mảng */
    int k = 100; /* Mỗi phần tử có giá trị ngẫu nhiên nằm trong khoảng từ 0 đến k */

    A = new int[n]; // Cấp phát bộ nhớ cho mảng A

    initRandomArray(A, n, k);

    /* Xuất mảng */
    for (int i = 0; i < n; i++) {
        printf("%4d", A[i]);
    }
    printf("\n");

    delete[]A; // Free vùng nhớ sau khi sử dụng
    return 0;
}
đã bổ sung 3.1 năm trước bởi
xuans2huy490

Không liên quan nhưng nếu bạn đã sử dụng cấp phát động cho mảng A, bạn nên free vùng nhớ đã cấp phát sau mỗi lần sử dụng bằng delete, C/C++ không thể tự làm việc này, nếu không bạn đã vô tình tạo nên rò rỉ bộ nhớ, xem thêm rò rỉ bộ nhớ trong lập trình là gì?

minhkiet 29.10.2018

Cảm ơn @minhkiet, mình đã cập nhật lại câu trả lời.

xuans2huy 30.10.2018
1

Bạn có thể giải thích tại sao tại đoạn code chia lấy dư với số k lại được một kết quả nằm trong khoảng từ 0 đến k không?

randNum = rand() % k;

Nếu giả sử mình muốn tạo ngẫu nhiên từ 10 đến k hoặc từ một số bất kỳ nhỏ hơn k đến k thì làm thế nào ạ? Cảm ơn nhiều!!!

Việt Cuponi 29.10.2018

Đó chỉ là một tính chất của phép chia lấy dư số nguyên trong toán học mà chúng ta áp dụng nó qua tin học, với hai số nguyên $a$ và $b$, phép chia lấy dư (kí hiệu $a \% b$) luôn luôn cho kết quả nhỏ hơn $b$ với bất kỳ giá trị nào của $a$ hoặc $b$.

Ví dụ:

$$a = 123, b = 100 \Rightarrow a \% b = 23$$

$$a = 29, b = 100 \Rightarrow a \% b = 29$$

$$a = 123456789, b = 100 \Rightarrow a \% b = 89$$

Sử dụng mã nguồn printf("%d", a % b) trong C để kiểm chứng kết quả.

Bởi vì kết quả luôn nằm trong khoảng từ 0 đến nhỏ hơn k nên nếu bạn muốn tạo ngẫu nhiên từ 10 đến k bạn chỉ cần cộng thêm giá trị sau khi chia được cho 10:

randNum = rand() % k + 10;

Nếu là một số bất kỳ nhỏ hơn k thì bạn chỉ việc cộng thêm số bất kỳ đó vào biểu thức, giả sử c là một số bất kỳ:

randNum = rand() % k + c;
xuans2huy 30.10.2018

Viết thủ tục tạo lập danh sách gồm 100 số tự nhiên ngẫu nhiên nhỏ hơn hoặc bằng 2018 mọi người giúp đỡ mình với ạ, viết bằng ngôn ngữ C ạ?

Cộng đồng 17.05.2019

Thay n = 100k = 2019 là được mà, nếu không thích cấp phát bộ nhớ động bạn có thể bỏ hai câu lệnh cấp phát bộ nhớ và free bộ nhớ đi, khởi tạo một mạng cố định bằng cách thay int *A thành int A[100].

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

int main() {
    const int n = 100; /* Số lượng phần tử của mảng */
    int A[n]; /* Mảng a có n phần tử */
    int k = 2019; /* Mỗi phần tử có giá trị ngẫu nhiên nằm trong khoảng từ 0 đến k */

    srand(time(NULL));
    int randNum = 0;
    for (int i = 0; i < n; i++) {
        randNum = rand() % k;
        A[i] = randNum;
    }

    /* Xuất mảng */
    for (int i = 0; i < n; i++) {
        printf("%10d", A[i]);
    }
    printf("\n");

    return 0;
}
Member4671 17.05.2019

sinh mảng ngẫu nhiên N số nguyên trong khoảng -100 đến 100 thì sao ạ, e cám ơn

haunguyen 16.07.2020

Thay đổi 2 dòng code ở câu trả lời trên:

Thay int k = 100; thành int k = 200;

Thay randNum = rand() % k; thành randNum = rand() % k - 100;

Idea cơ bản là shift kết quả, giả sử bạn tạo số ngẫu nhiên từ -1 đến 10, trước hết bạn sẽ tạo số ngẫu nhiên từ 0 đến 11 sau đó trừ đi cho 1, thì sẽ được kết quả sẽ nằm trong khoảng -1 đến 10.

Cộng đồng 16.07.2020
thêm bình luận...
Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)