- Home /
Weighted Item Generator returns same Item
I'm trying to create a random item generator using weighted variables. The problem is that the same Item gets returned each time. Am I just not seeing something here? Any help is appreciated.
using UnityEngine;
using System.Collections;
public class TestGenerator {
public enum TestItems{
ammo22, ammo45, ammo9mm, beretta
}
public int[] chances = new int[]{
10, 10, 10, 1
};
public ItemData GetItem(){
ItemData data = new ItemData();
int result = 0;
int range = 0;
for(int i = 0; i < chances.Length; i++){
range += chances[i];
}
int random = Random.Range(0, range + 1);
Debug.Log("Random = " + random);
int top = 0;
for(int t = 0; t < chances.Length; t++){
top += chances[t];
Debug.Log("Top = " + top);
if(random < top){
result = t;
Debug.Log("Top = " + top);
}
}
if(result == (int)TestItems.ammo22)
data = AmmoTemplates.Ammo22();
else if(result == (int)TestItems.ammo45)
data = AmmoTemplates.Ammo45();
else if(result == (int)TestItems.ammo9mm)
data = AmmoTemplates.Ammo9mm();
else if(result == (int)TestItems.beretta)
data = HandgunTemplates.Beretta();
return data;
}
}
Answer by cwperkins83 · Feb 10, 2016 at 12:55 PM
I figured it out. It was as simple as adding a break after the result on Line 32.
Answer by Bunny83 · Feb 10, 2016 at 12:59 PM
You need a break
inside your if statement to terminate your for loop. If you don't you will iterate all the way through the array and you will replace the result each iteration once the top value is greater than your choosen random value. So you'll always end up with the last item being selected.
You could place the data selection inside the if and use return directly:
for(int t = 0; t < chances.Length; t++){
top += chances[t];
Debug.Log("Top = " + top);
if(random < top){
if(t == (int)TestItems.ammo22)
return AmmoTemplates.Ammo22();
else if(t == (int)TestItems.ammo45)
return AmmoTemplates.Ammo45();
else if(t == (int)TestItems.ammo9mm)
return AmmoTemplates.Ammo9mm();
else if(t == (int)TestItems.beretta)
return HandgunTemplates.Beretta();
}
}
return null; // or a different default value
Your answer
![](https://koobas.hobune.stream/wayback/20220612063655im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Resources.Load problem 1 Answer
Random Number Generator 4 Answers
Creating a random prefab generator in C# for endless runner 3 Answers