randomSeed()

Mô tả

Hàm random() luôn trả về một số ngẫu nhiên trong phạm vi cho trước. Giả sử mình gọi hàm này 10 lần, nó sẽ trả về 10 giá trị số nguyên ngẫu nhiên. Nếu gọi nó n lần, random() sẽ trả về n số. Tuy nhiên những giá trị mà nó trả về luôn được biết trước (cố định).

Bạn hãy chạy thử chương trình sau

void setup(){
  Serial.begin(9600);
}

void loop(){
  Serial.println(random(100));
  delay(200);
}

Tôi có thể khẳng định rằng 10 giá trị "ngẫu nhiên" đầu tiên bạn nhận được là: 7, 49, 73, 58, 30, 72, 44, 78, 23, 9,.... Điều này nghe có vẻ không được "ngẫu nhiên" cho lắm. 

Bạn hãy thử chạy chương trình này:

void setup(){
  Serial.begin(9600);
  randomSeed(10);
}

void loop(){
  Serial.println(random(100));
  delay(200);
}

Nhận thấy rằng: chuỗi giá trị mà hàm random() trả về đã có sự thay đổi. Tuy nhiên chuỗi này vẫn là chuỗi cố định. Thử thay đổi tham số của lệnh randomSeed() từ 10 sang một số khác, bạn sẽ thấy chuỗi số trả về cũng thay đổi theo nhưng giá trị xuất ra thì vẫn cố định, dù cho bạn có bấm nút reset trên Arduino thì chuỗi số được in ra những lẫn sau đều y hệt như lần đầu tiên chúng được in ra. Để ý rằng tham số của hàm random() vẫn cố định, dĩ nhiên nếu bạn thay đổi tham số này thì chuỗi ngẫu nhiên trả về sẽ thay đổi theo, nhưng chúng cũng vẫn là một chuỗi số cố định.

Với cùng khoảng giá trị truyền vào hàm random(), hàm randomSeed() quyết định trật tự các giá trị mà random() trả về. Trật tự này phụ thuộc vào tham số mà ta truyền vào randomSeed().

Cú pháp

randomSeed(number);

Với number là một số nguyên bất kì.

Lưu ý: nếu bạn gọi hàm random() mà không chạy lệnh randomSeed() trước đó, chương trình sẽ mặc định chạy sẵn lệnh randomSeed(0) (tham số là 0).

Ví dụ

Nếu chạy randomSeed(0), hàm random(100) sẽ trả về 10 giá trị đầu tiên là: 7,  49,  73,  58,  30,  72,  44,  78,  23,  9, ...

Nếu chạy randomSeed(10), hàm random(100) sẽ trả về 10 giá trị đầu tiên là: 70 , 43, 1, 92, 65, 26, 40, 98, 48, 67, ...

Nếu chạy randomSeed(-46), hàm random(100) sẽ trả về 10 giá trị đầu tiên là: 15, 50, 82, 36, 36, 37, 25, 59, 93, 74, ...

Nếu chạy randomSeed(159), hàm random(100) sẽ trả về 10 giá trị đầu tiên là: 13, 51, 67, 38, 22, 50, 67, 73, 81, 75, ...

Nếu chạy randomSeed(159), hàm random(99) sẽ trả về 10 giá trị đầu tiên là: 67, 42, 70, 34, 53, 6, 42, 38, 29, 64, ...

Mẹo nhỏ

Nếu bạn cần một chuỗi số ngẫu nhiên một cách thực sự, tức là giá trị của chuỗi số trả về không thể xác định được, hãy chạy lệnh randomSeed() với một tham số ngẫu nhiên truyền vào.

Tham khảo chương trình sau

void setup() {
  Serial.begin(9600);
  randomSeed(analogRead(A0));
}

void loop() {
  Serial.println(random(100));
  delay(300);
}

Ở đây tham số ngẫu nhiên truyền vào randomSeed() là giá trị trả về của analogRead(A0) với chân A0 trên Arduino không được sử dụng. Ngoài ra, bạn cũng có thể sử dụng tham số truyền vào randomSeed() là thời gian trên đồng hồ hệ thống.

Reference Tags: 
lên
8 thành viên đã đánh giá bài viết này hữu ích.
Các bài viết cùng tác giả

Học Arduino qua dự án làm xe điều khiển từ xa - Phần 1: Tổng quan

Chắc hẳn nhiều bạn mới học Arduino đều muốn tự làm cho mình một chiếc xe điều khiển từ xa phải không nào ? Loạt bài viết này sẽ giúp bạn giải đáp những khúc mắc của bản thân. Mình sẽ tập trung trình bày những gì liên quan đến Arduino trong dự án này, do vậy, nói thẳng ra là sản phẩm làm ra chỉ thích hợp cho việc tìm hiểu về Arduino (hay nói đúng hơn là để chơi là chính) hơn là để thương mại hóa, để các bạn không hiểu nhầm.

lên
27 thành viên đã đánh giá bài viết này hữu ích.

highByte()

highByte() là hàm trả về một chuỗi 8 bit kề với 8 bit cuối cùng của một chuỗi các bit. Như vậy, nếu dữ liệu đưa vào một chuỗi 16bit thì highByte() sẽ trả về 8 bit đầu tiên, nếu dữ liệu đưa vào là một chuỗi 8bit hoặc nhỏ hơn, highByte() sẽ trả về giá trị 0. Một số nguyên bất kì cũng được xem như là một chuỗi các bit, vì bất kì số nguyên nào cũng có thể biểu diễn ở hệ nhị phân dưới dạng các bit "0" và "1".

lên
3 thành viên đã đánh giá bài viết này hữu ích.