Trong lập trình không thể tạo ra giá trị ngẫu nhiên (random)

1 bài toán đơn giản như kiểu chọn ngẫu nhiên 1 số từ 1->100
Nhưng hình như không có cách nào để làm cả
Hàm random có sẵn cũng không thể tạo ra giá trị ngẫu nhiên
Mà giá trị random đó được tạo dựa vào 1 vài con số ( thời gian hiện tại… )
Trong c# nếu ta tạo 2 new Random() đồng thời. Thì nó sẽ cho cùng 1 giá trị nếu chạy cùng 1 thời điểm
Ví dụ

x = new Random().Next(0,100);
y = new Random().Next(0,100);

=> Ngạc nhiên chưa. Khi in giá trị của x và y thì nó luôn luôn bằng nhau
Ta buộc phải làm cách khác

Random ran = new Random();
x = ran.Next(0,100);
y = ran.Next(0,100);

=> Thực sự không có cách nào để tạo 1 giá trị mang tính ngẫu nhiên thực sự

1 Like

Hi Hải Duy Nguyễn.

3 Likes

@Tao Không Ngu
Việc tạo dựa vào bức ảnh kiểu này có vẻ mới lạ. Nhưng nó cũng ko ngẫu nhiên cho lắm
Vì nếu ta tạo 2 giá trị ngẫu nhiên cùng 1 thời điểm ( ảnh chụp tại cùng 1 thời điểm có cùng giá trị )
Thì chúng sẽ như nhau

2 Likes

Search google cho kỹ trước nha em, có hẳn 1 trang nghiên cứu về thuật toán RNG (random number generation) đây: http://www.pcg-random.org/

Còn em generate ra 2 số random giống nhau là đúng rồi, vì ở thời điểm em tạo Random object x và y đều dùng chung seed của Random object thì sao mà khác nhau dc!

RNG có hẳn 1 ngành nghiên cứu về nó, nếu em đi sâu xuống sẽ thấy rất rất nhiều kiến thức!

8 Likes

Theo như mình biết thì không bao giờ có random thực sự, khi mà một hàm, với một Input chỉ có thể có 1 Output. Các hàm càng có nhiều input thì output càng khó đoán định.

Kể cả con người: http://www.loper-os.org/bad-at-entropy/manmach.html

4 Likes

@Trần Hoàn
Hàm random ở link của bạn là hàm random ngớ ngẩn nhất mh biết @@

1 Like

@Nguyễn Phạm Anh Quân
Thực sự là không thể tạo ra giá trị ngẫu nhiên. Không có một hàm nào có thể tạo được
Nói đơn giản như việc ta viết 1 hàm cho giá trị ngẫu nhiên 1 hoặc 2 ( không dùng hàm có sẵn )
Thì không thể nào viết nổi nếu không có tham số
Nhìn chung thì ta thường lấy thời gian hiện tại làm tham số. Hoặc dù có lấy 1 bức ảnh, từ 1 câu nói vào micro…
Thì 1 hàm cũng không thể độc lập chính nó tạo ra giá trị ngẫu nhiên được
Mà nó luôn lấy cmn 1 tham số mang tính ngẫu nhiên

1 Like

C# có RNGCryptoServiceProvider tạo số ngẫu nhiên ko xác định đấy, tạo số ngẫu nhiên dễ mà, nó “ngẫu nhiên” cỡ nào thì mới là vấn đề.

2 Likes

@xn
Bạn không hiểu rồi. Không có hàm nào tạo ra giá trị ngẫu nhiên cả
Ví dụ tham số đầu vào là thời gian hiện tại, chụp 1 bức ảnh động, 1 câu nói vào micro
=> Vốn tham số đầu vào đã là ngẫu nhiên chứ 1 hàm không hề tạo ra cái gì ngẫu nhiên cả

1 Like

Nói như bạn thì người ta nghiên cứu RNG làm gì nữa? Bạn có biết trong xác suất tính xác suất nhỏ đến 0.00001 vẫn có ko? Nếu nói như bạn thì cả cái ngành xác suất xem như vứt đi, và sẽ ko có machine learning và các công nghệ hiện tại!

1 Like

thì đúng là máy tính ko thể tạo ra bit ngẫu nhiên, vì nếu 1 cái máy chạy ngẫu nhiên thì đâu có xài nó được: ví dụ bạn input “Abc” nó in ra “asdfasdf” thì đó đâu phải cái máy tính. Bạn muốn tạo ra 1 cái máy bảo gì làm nấy hay là bảo 1 đằng làm 1 nẻo?

muốn máy tính tạo số ngẫu nhiên thì phải input cho nó 1 số bit ngẫu nhiên trước, rồi nó sẽ xài 1 cái thuật toán nào đó để sinh những bit “giả” ngẫu nhiên tiếp theo. Thuật toán sinh bit giả ngẫu nhiên đó nhiều lắm, lẹ thì xài linear congruent, chậm thì xài Mersenne twister, v.v…

7 Likes

@Hải Duy Nguyễn

Máy tính vẫn có thể tự sinh những giá trị ngẫu nhiên mà ko cần người ta đào tạo nó nhé, đó là 1 nhánh của Machine learning : unsupervised learning & reinforcement learning!
Mà ko hiểu bạn có hiểu ngẫu nhiên là gì ko? Vd sự sáng tạo của con người là do được đào tạo rồi mới sinh ra cái mới từ những cái đã biết! Còn trong tự nhiên thì ko ai đào tạo cả, nhưng con người vẫn nghiên cứu được (vd dự báo thời tiết, dự báo động đất) những qui luật ngẫu nhiên của tự nhiên, rồi mô phỏng lại! Tất nhiên vẫn có sai số! Nếu ko có ngẫu nhiên thì ko thể có chuyện AlphaGo của Google thắng dc kiện tướng cờ vây nhé!
Khẳng định lại, RNG có hẳn 1 ngành nghiên cứu về nó, bạn nên đọc kỹ lại link mình gửi!
Còn các input bạn nói, đó chỉ là 1 số có range rất lớn để làm base thôi, chứ ko phải input ngẫu nhiên rồi mới sinh ra được nhé, bạn hiểu sai bản chất rồi!

2 Likes

@Nguyễn Phạm Anh Quân
Mình chẳng cần nghiên cứu. Nhưng bạn nói không có cơ sở
1 hàm chạy nếu không cho nó 1 giá trị ngẫu nhiên thì nó luôn trả về 1 kết quả
Muốn nó trả về ngẫu nhiên trừ khi nó được cung cấp 1 biến ngẫu nhiên
=> Bạn có tưởng tượng ra 1 cỗ máy chạy 1 hàm với tất cả dòng lệnh và biến giống nhau lại có thể trả về 1 kết quả random ko?

1 Like

Tưởng tượng bạn viết ngôn ngữ assembly ( asm )
với tất cả các lệnh, biến, giống nhau
=> máy tính chạy đúng những gì bạn viết và luôn luôn đúng

1 Like

Còn AlphaGo cũng không có gì ghê gớm lắm
Nó được dạy 1 số luật của cờ vây
Sau đó như con người. Nó tự chơi với chính nó
=> Sau mỗi ván chơi nó sẽ nhận ra đi những nước cờ này, này này là sai ( những nước đi mất điểm )
Chỉ có điều khác với con người nó chơi liên tục với tốc độ của máy tính
=> Không bao giờ có thể đánh bại được AlphaGo

1 Like

khái niệm ngẫu nhiên với bạn là ntn??

1 Like

Thay vì true hoặc false thì có 1 giá trị để máy tính quyết định
Ví dụ thay vì if(true) hoặc if(false) thì if(??)
?? đó là 1 biến không true, không false
=> Chưa nghĩ ra biến đó như thế nào

1 Like

Hàm random nào hả bạn :)) Đó là chương trình để chứng minh con người không random thôi mà :))

2 Likes

Không biết nói gì luôn. :joy:
Mấy bạn khỏi cần đưa link gì hết, thớt không đọc đâu.

7 Likes

@ Trần Hoàn ?
Chứng minh con người không random. Bằng cách nào. Bằng cách dựa vào những nước đi trước đó sao?
Mình lấy ví dụ tỷ lệ ra 2 con đề (0->99) giống nhau trong 2 ngày liên tiếp là 1% x 1% = 1 / 10000
Tuy nhiên bạn có chạy những hàm random với bất cứ công nghệ nào 10000 lần thì không phải là 1 / 10000 nữa
Mà có lúc trong 1 trăm nghìn lần đó không xuất hiện 2 số liên tiếp giống nhau hoặc xuất hiện vài lần 2 số giống nhau liên tiếp
=> Bạn không thể dựa vào 1 bảng dãy số có sẵn để dự đoán tỷ lệ được
Cũng như người ta ôm cả quyển sổ lô đề để tính xác xuất ấy
Bởi vì số tiếp theo là ngẫu nhiên và không dựa vào các số trước đó
@Hung
Bạn có hiểu bản chất vấn đề không
Bạn có biết bất kể ngôn ngữ nào cũng chạy dưới dạng asembly ( ngôn ngữ máy )
Ngay cả những ngôn ngữ như c# java thì framework cũng phải chuyển về ngôn ngữ máy thì máy tính mới có thể hiểu được
Với các lệnh asm và các biến, giá trị không đổi thì bao giờ cũng cho ra 1 kết quả chứ ko random
Ngay cả các thuật toán mã hóa như md5 hay sha1 cũng không phải random khi mà với mỗi giá trị đầu vào cho ra chính xác cùng 1 kết quả
Giống như số Pi. Ta có thể nói số Pi là ngẫu nhiên? Có thự sự vậy không (số căn bậc 2 của 10)
Có ngẫu nhiên không khi mà đằng sau dấu phẩy các giá trị luôn cố định
Và nó không bao giờ là ngẫu nhiên với số Pi khi mà nó phải thỏa mãn điều kiện là căn bậc 2 của 10
Và khi máy tính đủ mạnh và có những thuật toán đủ mạnh. Thì dù bạn có hỏi đằng sau dấu phẩy của số pi 10 mũ 1 tỷ lần thì máy tính vẫn sẽ trả lời cho bạn

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