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 <437025+paulloz@users.noreply.github.com>
Co-authored-by: Raul Santos <raulsntos@gmail.com>
Co-authored-by: tetrapod <145553014+tetrapod00@users.noreply.github.com>
This commit is contained in:
ssBandit
2024-11-20 02:37:18 +02:00
committed by GitHub
parent 1b51bb7b1a
commit 892322b5b1

View File

@@ -145,12 +145,12 @@ varying by the deviation (1.0 by default):
.. code-tab:: gdscript GDScript
# 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
// 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
``from`` and ``to``, and returns a random floating-point number between ``from``
@@ -165,7 +165,7 @@ and ``to``:
.. code-tab:: csharp
// 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``
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
// 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
--------------------------
@@ -314,7 +314,7 @@ We can apply similar logic from arrays to dictionaries as well:
.. tabs::
.. code-tab:: gdscript GDScript
var metals = {
var _metals = {
"copper": {"quantity": 50, "price": 50},
"silver": {"quantity": 20, "price": 150},
"gold": {"quantity": 3, "price": 500},
@@ -327,11 +327,36 @@ We can apply similar logic from arrays to dictionaries as well:
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.
# The same metal may be selected multiple times in succession.
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:
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
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"]
# 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,
# and remove it from the `_fruits` array.
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
.. 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
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
@@ -511,7 +575,7 @@ terrain. Godot provides :ref:`class_fastnoiselite` for this, which supports
public override void _Ready()
{
// Configure the FastNoiseLite instance.
_noise.NoiseType = NoiseTypeEnum.SimplexSmooth;
_noise.NoiseType = FastNoiseLite.NoiseTypeEnum.SimplexSmooth;
_noise.Seed = (int)GD.Randi();
_noise.FractalOctaves = 4;
_noise.Frequency = 1.0f / 20.0f;