Trik menyimpan bilangan random dengan arduino

Dengan arduino kita bisa menghasilkan bilangan acak (random generator) dengan menggunakan sketch/program:

long randNumber;

void setup(){
  Serial.begin(9600);
  Serial.println("Menyimpan bilangan acak/random");
  Serial.println("https://www.project.semesin.com");

  randomSeed(analogRead(0));
}

void loop() {
  // print bilangan acak dari 0 hingga 299
  randNumber = random(300);
  Serial.println(randNumber);

  delay(1000);
}

Nilai acak/random yang dihasilkan oleh mesin digital seperi arduino tidaklah sepenuhnya acak, karena secara pandang digital diperlukan metode matematis (contohnya LFSR – linear-feedback shift register) dengan menerapkan suatu persamaan dimana bilangan berikutnya dihitung dari bilangan yang ada sekarang.

Dengan demikian nilai random yang dihasilkan merupakan perulangan terus menerus dan berulang. Agar deretan acak ini menghasilkan deretan berbeda setiap waktu, maka diberikan nilai awal (seed). salah satu contoh pepuler adalah perintah analogRead(pin):

  nilaiAwal = analogRead(0);
  randomSeed(nilaiAwal);

Untuk kembali ke bilangan sebelumnya kita bisa menyimpan deret bilangan ke dalam array, namun tidak efisien untuk jumlah bilangan yang besar. Untuk itu kita bisa menggunakan trik yaitu dengan melakukan perulangan dengan memberi nilai awal (seed) yang sama.

contohnya seperti sketch berikut:

long randNumber;
uint16_t nilaiAwal;

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

  nilaiAwal = analogRead(0);
  randomSeed(nilaiAwal);
}

void loop() {
  randNumber = ambilDeretAcak(nilaiAwal, 100, 300);
  Serial.println(randNumber);
  
  delay(1000);
}

uint16_t ambilDeretAcak(uint16_t nilaiawal, uint16_t urutan, uint16_t nilaiAcakMaksimal)
{
  uint16_t nilaiAcak;

  randomSeed(nilaiawal);
  for(uint16_t i=0;i<urutan;i++)
  {
    nilaiAcak = random(nilaiAcakMaksimal);
  }
  return nilaiAcak;
}

fungsi ambilDeretAcak akan menghasilkan bilangan yang berada di urutan tertentu dalam deret acak dengan nilai awal tertentu.

Leave a Reply

Your email address will not be published. Required fields are marked *