Browse Source

Add C# code to random_number_generation and fix shuffle bag example. (#8072)

* Add C# code to random_number_generation and fix shuffle bag example.

Changes made to shuffle bag example:
- Replace .empty() with .is_empty()
- More descriptive comment
- Change code-block into a tabbed code block

---------

Co-authored-by: Paul Joannon <[email protected]>
Co-authored-by: Raul Santos <[email protected]>
Co-authored-by: tetrapod <[email protected]>
ssBandit 8 months ago
parent
commit
892322b5b1
1 changed files with 75 additions and 11 deletions
  1. 75 11
      tutorials/math/random_number_generation.rst

+ 75 - 11
tutorials/math/random_number_generation.rst

@@ -145,12 +145,12 @@ varying by the deviation (1.0 by default):
  .. code-tab:: gdscript GDScript
  .. code-tab:: gdscript GDScript
 
 
     # Prints a random floating-point number from a normal distribution with a mean 0.0 and deviation 1.0.
     # Prints a random floating-point number from a normal distribution with a mean 0.0 and deviation 1.0.
-    print(randfn())
+    print(randfn(0.0, 1.0))
 
 
  .. code-tab:: csharp
  .. code-tab:: csharp
 
 
-    // Prints a random floating-point number from a normal distribution with a mean of 0.0 and deviation of 1.0.
-    GD.Print(GD.Randfn());
+    // Prints a random floating-point number from a normal distribution with a mean 0.0 and deviation 1.0.
+    GD.Print(GD.Randfn(0.0, 1.0));
 
 
 :ref:`randf_range() <class_@GlobalScope_method_randf_range>` takes two arguments
 :ref:`randf_range() <class_@GlobalScope_method_randf_range>` takes two arguments
 ``from`` and ``to``, and returns a random floating-point number between ``from``
 ``from`` and ``to``, and returns a random floating-point number between ``from``
@@ -165,7 +165,7 @@ and ``to``:
  .. code-tab:: csharp
  .. code-tab:: csharp
 
 
     // Prints a random floating-point number between -4 and 6.5.
     // Prints a random floating-point number between -4 and 6.5.
-    GD.Print(GD.RandfRange(-4, 6.5));
+    GD.Print(GD.RandRange(-4.0, 6.5));
 
 
 :ref:`randi_range() <class_@GlobalScope_method_randi_range>` takes two arguments ``from``
 :ref:`randi_range() <class_@GlobalScope_method_randi_range>` takes two arguments ``from``
 and ``to``, and returns a random integer between ``from`` and ``to``:
 and ``to``, and returns a random integer between ``from`` and ``to``:
@@ -178,8 +178,8 @@ and ``to``, and returns a random integer between ``from`` and ``to``:
 
 
  .. code-tab:: csharp
  .. code-tab:: csharp
 
 
-    // Prints a random integer between -10 and 10.
-    GD.Print(GD.RandiRange(-10, 10));
+    // Prints a random integer number between -10 and 10.
+    GD.Print(GD.RandRange(-10, 10));
 
 
 Get a random array element
 Get a random array element
 --------------------------
 --------------------------
@@ -314,7 +314,7 @@ We can apply similar logic from arrays to dictionaries as well:
 .. tabs::
 .. tabs::
  .. code-tab:: gdscript GDScript
  .. code-tab:: gdscript GDScript
 
 
-    var metals = {
+    var _metals = {
         "copper": {"quantity": 50, "price": 50},
         "copper": {"quantity": 50, "price": 50},
         "silver": {"quantity": 20, "price": 150},
         "silver": {"quantity": 20, "price": 150},
         "gold": {"quantity": 3, "price": 500},
         "gold": {"quantity": 3, "price": 500},
@@ -327,11 +327,36 @@ We can apply similar logic from arrays to dictionaries as well:
 
 
 
 
     func get_metal():
     func get_metal():
-        var random_metal = metals.values()[randi() % metals.size()]
+        var random_metal = _metals.values()[randi() % metals.size()]
         # Returns a random metal value dictionary every time the code runs.
         # Returns a random metal value dictionary every time the code runs.
         # The same metal may be selected multiple times in succession.
         # The same metal may be selected multiple times in succession.
         return random_metal
         return random_metal
 
 
+ .. code-tab:: csharp
+
+    private Godot.Collections.Dictionary<string, Godot.Collections.Dictionary<string, int>> _metals = new()
+    {
+        {"copper", new Godot.Collections.Dictionary<string, int>{{"quantity", 50}, {"price", 50}}},
+        {"silver", new Godot.Collections.Dictionary<string, int>{{"quantity", 20}, {"price", 150}}},
+        {"gold", new Godot.Collections.Dictionary<string, int>{{"quantity", 3}, {"price", 500}}},
+    };
+
+    public override void _Ready()
+    {
+        for (int i = 0; i < 20; i++)
+        {
+            GD.Print(GetMetal());
+        }
+    }
+
+    public Godot.Collections.Dictionary<string, int> GetMetal()
+    {
+        var (_, randomMetal) = _metals.ElementAt((int)(GD.Randi() % _metals.Count));
+        // Returns a random metal value dictionary every time the code runs.
+        // The same metal may be selected multiple times in succession.
+        return randomMetal;
+    }
+
 .. _doc_random_number_generation_weighted_random_probability:
 .. _doc_random_number_generation_weighted_random_probability:
 
 
 Weighted random probability
 Weighted random probability
@@ -443,7 +468,10 @@ could get the same fruit three or more times in a row.
 
 
 You can accomplish this using the *shuffle bag* pattern. It works by removing an
 You can accomplish this using the *shuffle bag* pattern. It works by removing an
 element from the array after choosing it. After multiple selections, the array
 element from the array after choosing it. After multiple selections, the array
-ends up empty. When that happens, you reinitialize it to its default value::
+ends up empty. When that happens, you reinitialize it to its default value:
+
+.. tabs::
+ .. code-tab:: gdscript GDScript
 
 
     var _fruits = ["apple", "orange", "pear", "banana"]
     var _fruits = ["apple", "orange", "pear", "banana"]
     # A copy of the fruits array so we can restore the original value into `fruits`.
     # A copy of the fruits array so we can restore the original value into `fruits`.
@@ -467,9 +495,45 @@ ends up empty. When that happens, you reinitialize it to its default value::
         # Get a random fruit, since we shuffled the array,
         # Get a random fruit, since we shuffled the array,
         # and remove it from the `_fruits` array.
         # and remove it from the `_fruits` array.
         var random_fruit = _fruits.pop_front()
         var random_fruit = _fruits.pop_front()
-        # Prints "apple", "orange", "pear", or "banana" every time the code runs.
+        # Returns "apple", "orange", "pear", or "banana" every time the code runs, removing it from the array.
+        # When all fruit are removed, it refills the array.
         return random_fruit
         return random_fruit
 
 
+ .. code-tab:: csharp
+
+    private Godot.Collections.Array<string> _fruits = new() { "apple", "orange", "pear", "banana" };
+    // A copy of the fruits array so we can restore the original value into `fruits`.
+    private Godot.Collections.Array<string> _fruitsFull;
+
+    public override void _Ready()
+    {
+        _fruitsFull = _fruits.Duplicate();
+        _fruits.Shuffle();
+
+        for (int i = 0; i < 100; i++)
+        {
+            GD.Print(GetFruit());
+        }
+    }
+
+    public string GetFruit()
+    {
+        if(_fruits.Count == 0)
+        {
+            // Fill the fruits array again and shuffle it.
+            _fruits = _fruitsFull.Duplicate();
+            _fruits.Shuffle();
+        }
+
+        // Get a random fruit, since we shuffled the array,
+        string randomFruit = _fruits[0];
+        // and remove it from the `_fruits` array.
+        _fruits.RemoveAt(0);
+        // Returns "apple", "orange", "pear", or "banana" every time the code runs, removing it from the array.
+        // When all fruit are removed, it refills the array.
+        return randomFruit;
+    }
+
 When running the above code, there is a chance to get the same fruit twice in a
 When running the above code, there is a chance to get the same fruit twice in a
 row. Once we picked a fruit, it will no longer be a possible return value unless
 row. Once we picked a fruit, it will no longer be a possible return value unless
 the array is now empty. When the array is empty, we reset it back to its default
 the array is now empty. When the array is empty, we reset it back to its default
@@ -511,7 +575,7 @@ terrain. Godot provides :ref:`class_fastnoiselite` for this, which supports
     public override void _Ready()
     public override void _Ready()
     {
     {
         // Configure the FastNoiseLite instance.
         // Configure the FastNoiseLite instance.
-        _noise.NoiseType = NoiseTypeEnum.SimplexSmooth;
+        _noise.NoiseType = FastNoiseLite.NoiseTypeEnum.SimplexSmooth;
         _noise.Seed = (int)GD.Randi();
         _noise.Seed = (int)GD.Randi();
         _noise.FractalOctaves = 4;
         _noise.FractalOctaves = 4;
         _noise.Frequency = 1.0f / 20.0f;
         _noise.Frequency = 1.0f / 20.0f;