From 13e2a6c5166371078f9f228370ddd3ce155b7aba Mon Sep 17 00:00:00 2001
From: ACKERMANNGUE <gawen.ackermann@hesge.ch>
Date: Tue, 11 Mar 2025 09:08:14 +0100
Subject: [PATCH] REMAKE : V2, collectible spawning generator using probability
 distribution

---
 .../Scripts/Road/CollectibleGenerator.cs      | 33 ++++++++++++-------
 1 file changed, 22 insertions(+), 11 deletions(-)

diff --git a/impulse/Assets/Scripts/Road/CollectibleGenerator.cs b/impulse/Assets/Scripts/Road/CollectibleGenerator.cs
index 8387975..d2360f6 100644
--- a/impulse/Assets/Scripts/Road/CollectibleGenerator.cs
+++ b/impulse/Assets/Scripts/Road/CollectibleGenerator.cs
@@ -41,27 +41,38 @@ public class CollectibleGenerator : MonoBehaviour
 
     private Transform SelectSlotWithPreference(List<Transform> slots, int preferenceCode)
     {
-        slots.Sort((a, b) => a.position.x.CompareTo(b.position.x));
+        slots.Sort((a, b) => a.position.x.CompareTo(b.position.x)); 
 
-        int slotCount = slots.Count;
-        int chosenIndex = Random.Range(0, slotCount);
+        float[] probabilities;
 
         switch (preferenceCode)
         {
             case 1:
-                chosenIndex = Random.Range(0, Mathf.Max(1, slotCount / 3));
+                probabilities = new float[] { 0.6f, 0.25f, 0.15f }; // Favor 0 slot
                 break;
-            case 2: 
-                chosenIndex = Random.Range(0, slotCount);
+            case 2:
+                probabilities = new float[] { 0.33f, 0.33f, 0.34f }; // No favor
                 break;
-            case 3: 
-                chosenIndex = Random.Range(2 * slotCount / 3, slotCount);
+            case 3:
+                probabilities = new float[] { 0.15f, 0.25f, 0.6f }; // Favor 2 slot
                 break;
-            default: 
-                chosenIndex = Random.Range(0, slotCount);
+            default:
+                probabilities = new float[] { 0.33f, 0.33f, 0.34f }; // Security of all distribution proba
                 break;
         }
 
-        return slots[chosenIndex];
+        float randomValue = Random.value;
+        float cumulativeProbability = 0f;
+
+        for (int i = 0; i < slots.Count; i++)
+        {
+            cumulativeProbability += probabilities[i];
+            if (randomValue <= cumulativeProbability)
+                return slots[i];
+        }
+
+        return slots[2]; // Security if random.value == 1
     }
+
+
 }
-- 
GitLab