Random Numbers in Modelica

Here’s the translation of the Go code to Modelica, formatted in Markdown suitable for Hugo:

Our example demonstrates how to generate random numbers in Modelica. Here’s the full source code:

model RandomNumbers
  import Modelica.Math.Random;
  import Modelica.Utilities.Streams;

  Random.Generators.Xorshift128plus generator;
  Real randomFloat;
  Integer randomInt1, randomInt2;
  Real randomFloat1, randomFloat2;
  
equation
  when initial() then
    // Initialize the random number generator
    generator = Random.Generators.Xorshift128plus(seed=12345);
    
    // Generate random integers between 0 and 99
    randomInt1 = integer(100 * Random.Generators.nextDouble(generator));
    randomInt2 = integer(100 * Random.Generators.nextDouble(generator));
    Streams.print(String(randomInt1) + "," + String(randomInt2));
    
    // Generate a random float between 0.0 and 1.0
    randomFloat = Random.Generators.nextDouble(generator);
    Streams.print(String(randomFloat));
    
    // Generate random floats between 5.0 and 10.0
    randomFloat1 = 5.0 + (5.0 * Random.Generators.nextDouble(generator));
    randomFloat2 = 5.0 + (5.0 * Random.Generators.nextDouble(generator));
    Streams.print(String(randomFloat1) + "," + String(randomFloat2));
    
    // Using a fixed seed for reproducible results
    generator = Random.Generators.Xorshift128plus(seed=42);
    randomInt1 = integer(100 * Random.Generators.nextDouble(generator));
    randomInt2 = integer(100 * Random.Generators.nextDouble(generator));
    Streams.print(String(randomInt1) + "," + String(randomInt2));
    
    // Reinitializing with the same seed produces the same sequence
    generator = Random.Generators.Xorshift128plus(seed=42);
    randomInt1 = integer(100 * Random.Generators.nextDouble(generator));
    randomInt2 = integer(100 * Random.Generators.nextDouble(generator));
    Streams.print(String(randomInt1) + "," + String(randomInt2));
  end when;
end RandomNumbers;

In this Modelica code:

  • We use the Modelica.Math.Random package to generate random numbers.
  • Random.Generators.Xorshift128plus is used as the random number generator, which is similar to the PCG generator in the original example.
  • Random.Generators.nextDouble() generates a random float between 0.0 and 1.0.
  • To generate random integers, we multiply the result of nextDouble() by 100 and convert it to an integer.
  • We demonstrate generating random floats in a specific range (5.0 to 10.0) by scaling and offsetting the result of nextDouble().
  • We show how to use a fixed seed for reproducible results.

To run this model, you would typically use a Modelica simulation environment. The output will be printed to the simulation log or console.

Note that the exact output may vary depending on the Modelica implementation and simulation environment used. The concept of seeding for reproducible results is maintained, but the specific numbers generated will be different from the original example due to the different random number generation algorithm.

For more advanced random number generation capabilities in Modelica, you can refer to the Modelica.Math.Random package documentation in your Modelica environment or the Modelica Standard Library documentation.