DIY: Physical Random Number Generators

One of the benefits of Quantum Computing is their ability to generate truly random numbers.

Since classical computers are deterministic machines, governed by algorithms, they are inherently predictable. Therefor any number generated by a classical computer, even if it seems complex is actually based on a set of conditions or algorithm, which therefor makes it a “pseudo random number”, rather than truly random.

To generate truly random numbers you need to rely on a physical processor or phenomena that are unpredictable, examples of this include radioactive decay, electronic noise or even atmospheric noise.

Since QC is essentially based on a physical process and the probabilistic nature of quantum mechanics, its qubits can exist in a superposition state, this means they can represent a combination of 0 and 1 simultaneously, this state/property can be harnessed by QRNG (Quantum random number generators) to produce truly random numbers.

As a fun project, I decided to build a small physical QRNG using an Arduino, laser diode, beam splitter and two photo resistors. The basic premise is that you pulse the laser, it sends a wave/particle (both!) through the beam splitter, 50% of the time it should hit one of the two photo resistors, providing you with a random string of “1”s or “0”s.

While a very simple, basic and small example, it is a fun experiment. Check out OpenQbit.com if you would like to build your own. To make this a little easier, I laser cut a template/outline for the beam splitter for holding each of the components.

Enjoy Randomness? Check out these blog, sites, references: http://www.reallyreallyrandom.com

Non Quantum RNG generator using zener noise: http://www.reallyreallyrandom.com/zener/breadboard/

Nice video explaining the seed variables used and middle squares: https://www.khanacademy.org/computing/computer-science/cryptography/crypt/v/random-vs-pseudorandom-number-generators

/*      Annotated QRNGv1 Firmware V1.1
   Author: Noah G. Wood
   Modified: Paul Aschmann
   Copyright (c) 2019 Spooky Manufacturing, LLC
   License: GPLv3.0

*/
int triggerPin = 2; // This pin will pulse our quantum circuit
int hPin = A0; // This pin measures the horizontal polarized photons
int vPin = A1; // This pin measures the vertically polarized photons
float H = 0;
float V = 0;
long previousMillis = 0;
long interval = 1000;
float maxH = 0;
float maxV = 0;

void setup() {
  // Just setting up triggerPin and serial connection
  //pinMode(13, OUTPUT);
  pinMode(triggerPin, OUTPUT);
  Serial.begin(9600);
}

int Random() {
  // Pulse the laser
  digitalWrite(triggerPin, HIGH);
  //delay(1);
  digitalWrite(triggerPin, LOW);
}

void loop() {
  // The main program
  // Run our program and print the random bit to serial
  //delay(1000);  

  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis > interval) {
    previousMillis = currentMillis;
    Random();
  }

  // Read the photoresistors
  H = analogRead(hPin);
  V = analogRead(vPin);
  // Determine random bit
  if (H > V) { // More photons in the H mode, return 0
    Serial.println("-------------------- >  H: ");
    Serial.println(H);
    Serial.println("V: ");
    Serial.println(V);
    if (H > maxH) {
      maxH = H;
      Serial.println("New max H");
    }
  } else if (V > H) { // More photons in the V mode, return 1
    Serial.println("-------------------- > V: ");
    Serial.println(V);
    Serial.println("H: ");
    Serial.println(H);
    if (V > maxV) {
      maxV = V;
      Serial.println("New max V");
    }
  } else {
    Serial.println("Same values");
  }
  delay(1000);
}