Vấn đề về tạo số ngẫu nhiên

#include iostream
#include cstdlib
#include ctime
using namespace std;

int main()
{
	srand(time(NULL));
	int b = rand() %100 + 1;
	int a;
	cout << "May tao so ngau nhien da duoc tao, doan so duoc tao lon hon 50 hay nho hon 50." << endl;
	cout << "Voi so nho hon 50, nhap 0. Voi so lon hon 50 nhap 1." << endl;
		cout << "nhap so: "; cin >> a;
	
	if (a==1)
	{
		if (b > 50)
			cout << "Doan dung! so ngau nhien la: " << b << endl;
		if (b < 50)
			cout << "Doan sai! so ngau nhien la: " << b << endl;
	}
	else
	{
		if (a == 0)
		{
			if (b > 50)
				cout << "Doan sai! so ngau nhien la: " << b << endl;
			if (b < 50)
				cout << "Doan dung! so ngau nhien la: " << b << endl;

			
		}
	}
	system("pause");
	return 0;
}

Mọi người cho em hỏi sao code của em lại chạy từ 1-100 chứ không random ạ? em thử lại hơn chục lần rồi

Là sao nhỉ. :thinking:

2 Likes

lúc em chạy chương trình liên tục thì thấy con số random nó chỉ tăng dần từ 1-100 thôi chứ không giảm

Mình thấy nó cũng khá ngẫu nhiên mà nhỉ. :slight_smile:

Bạn thử chạy đoạn này xem sao.

for (int i = 0; i < 100; i++) cout << rand() % 100 + 1;

Nếu chạy thử nhiều lần mà nó vẫn cứ tăng dần như bạn nói thì bạn khá là có duyên đó. :slight_smile:

2 Likes

đoạn này thay ở chỗ nào thế em chưa thấy

Chạy thử trên GDB chẳng thấy vấn đề gì, ngẫu nhiên bình thường. Trừ việc phần khai báo thư viện bị báo lỗi.

#include iostream
#include cstdlib
#include ctime

Nên thay thành:

#include <iostream>
#include <cstdlib>
#include <ctime>
3 Likes

đúng r em copy paste lên comment nên nó mất <> chứ em khai báo đầy đủ, đây là kết quả sau 10 lần chạy thử liên tiếp : 26 42 62 75 91 4 11 27 40 55
chạy càng nhanh thì khoảng cách giữa 2 số càng ít

Vậy bạn đã chạy thử đoạn mình đưa. :question:

Không thay đâu cả, chỉ chạy riêng đoạn đó thôi.

#include <iostream>
#include <cstdlib>
#include <ctime>

int main() {
    srand(time(0));
    for (int i = 0; i < 20; i++) std::cout << rand() % 100 + 1 << ' ';
    return 0;
}
3 Likes

code của anh thì chạy random bt anh

Vậy bạn thử sài random lib của C++ xem sao.

2 Likes

mục đích của em là muốn hiểu tại sao nó lại chạy như thế thôi ạ, dù sao cũng cảm ơn anh

Mình không để ý. :smile:


Tại vì trùng hợp thôi. Thử tầm 100 lần là khác ngay à. :slight_smile:

1 Like

không phải do trùng hợp đâu anh… chiều em viết code rồi thử đến giờ vẫn vậy…

Do mỗi lần chạy thử của bạn là nó chỉ rand một lần duy nhất và phụ thuộc vào set srand(time(0)) nên không thể coi là ngẫu nhiên được. :slight_smile:

Thay vào đó, bạn làm một cái do. .while bọc cả đoạn code lại (đừng bọc luôn cả srand() vô nha) và chạy trong nhiều lần thì kết quả nó sẽ ngẫu nhiên hơn đó. :wink:

3 Likes

vậy nếu để srand(time(NULL)) thì có khác gì k hay nó là srand(time(0)) ạ?

Đúng ra phải là time(NULL), nhưng 0 về kiểu pointer thì nó tự ép về NULL. :kissing:

Bạn đọc thêm về function time()đây.

2 Likes

vâng em cảm ơn, để em nghiên cứu

Vấn đề của nó là nằm ở thuật toán random mà function rand() sử dụng. srand(time(NULL)) là dùng để set seed cho rand() và thuật toán sẽ dựa vào seed đó để random cho những lần tiếp theo.
Khi bác chạy lại chương trình, thì srand() nó sẽ set lại seed. Mà chạy lại càng nhanh thì seed lại càng giống nhau. Nên kết quả cho ra của rand() có thể sẽ không như bác mong muốn.

4 Likes

Nói chung là, một chuỗi số ngẫu nhiên nên được tạo ra bởi cùng 1 biến rand.
Nhiều chuỗi số ngẫu nhiên, nếu cần khác nhau thì cũng nên được tạo ra bởi cùng 1 biến rand.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?