Distribute a total value from a variable to multiple other variables?

Sorry if the question is a bit unclear, but to put it into perspective I will share my idea how I want this to work. I’ve searched through the forum but can’t really find anything that answers my question.

I’m working on a loot system for a (hopefully) upcoming RPG-like game.
I’m still a beginner to both Unity and C# but I feel I’m getting the hang on it pretty well.

The idea with the loot is:
Each item-types (Sword, Crossbow, Armor etc) will roll a random “gearscore” (haven’t come up with a proper name yet). The idea with the gearscore is that the value of the gearscore is the total value of points to distribute to the items stats.

Example:

Itemtype: Sword

Gearscore: 150

150 points will be randomly distributed to Strength, Attack speed, damage, etc etc).

Example:

150 points (the Gearscore) will be distributed like this (by random):

Strength: 55 p

Attack Speed: 25 p

Damage: 50 p

Critical Chance: 20 p

What would be the most effective, and easiest way to implement this function, to distribute the Gearscore to my stats (multiple variables)? How would you do it?

I don’t need a working code for it, just some ideas thrown at me from people that have been doing this for a while :slight_smile:

Let’s take for example a piece of equipment with 3 attributes and 150 points to distribute.


If you want a very simple code to use, I would go like this:

int numberOfPointsToDistribute = 150;
int numberOfAttributes = 3;

int pointsLeft = numberOfPointsToDistribute;
for(int i = 0; i < numberOfAttributes; i++)
{
    int randomPoints = Random.Range(0, pointsLeft);
    attributes *= randomPoints;*

pointsLeft -= randomPoints;
}
One flaw of this script is that the distribution is not evenly made for each attributes: the very first one have higher chance of having the maximum number (since random would pick from [0] to [150]) than the last one (since random would pick from [0 + attribute_1 + attribute_2 + … + attribute_n-1] to [150]).
----
If you want a more even way of doing it, I would go like that:
1. Get the average value for each attributes (in our case, 150 / 3 = 50)
2. For each attribute, give X points, where X = Mathf.Clamp(0, 150, average + Random.Range(-average, average))