Pensez à la différence entre 1 dé et 3 dés . 1 dé vous donne une probabilité égale pour toutes les valeurs, tandis que 3 dés auront tendance à avoir une probabilité plus élevée pour les valeurs vers le milieu.
Plus il y a de "dés" dans votre équation, plus vous avez de chances d'obtenir quelque chose vers le centre. Définissons donc une fonction qui peut gérer n'importe quel nombre uniformément :
// Takes a random number between floor and ceil
// pow defines how strongly these results should gravitate towards the middle
// We also define a function TrueRand(floor, ceil) elsewhere where you should substitute your own random function
int CenterRandom(int floor, int ceil, int pow = 3)
{
if(ceil == floor)
return ceil; // don't care to compare
int total = 0;
for(int x = 0; x < pow; x++)
{
total += TrueRand(floor, ceil);
}
return total / pow;
}
Maintenant, nous pouvons définir un exemple de fonction à utiliser:
// Distribues a number of points between floor and ceil
// We assume a function PlotPoint(int) exists to aid in creating the planet, etc...
void DistributePoints(int floor, int ceil, int numPoints)
{
// Could easily output this in the function parameters, but language wasn't specified
int[numPoints] breaks;
int numBreaks = 0;
// Special case for first pair
breaks[0] = CenterRandom(floor, ceil);
numBreaks++;
for(int x = 0; x < numPoints - 1; x++)
{
// Generate a random number linearly, this will be used for picking
// This way we have a greater chance of choosing a random value between larger pairs
int picker = TrueRandom(floor, ceil);
// Now we first find the pair of points that our picker exists on
// For simplicity, we handle the first and last pair separately
if(picker >= floor && picker < breaks[0])
{
breaks[x] = CenterRandom(floor, breaks[0] - 1);
}
for(int i = 0; i < numBreaks; i++)
{
if(picker > breaks[i] && picker < breaks[i+1])
{
breaks[x] = CenterRandom(breaks[i] + 1, breaks[i+1] - 1);
}
}
if(picker > breaks[numBreaks] && picker <= ceil)
{
breaks[x] = CenterRandom(breaks[numBreaks] + 1, ceil);
}
PlotPoint(breaks[x]); // Plot the point
}
}
Maintenant, le premier à noter est que ce code ne vérifie vraiment pas si le sélecteur correspond déjà à l'un des points. Si c'est le cas, cela ne générera tout simplement pas de point, peut-être quelque chose que vous aimeriez.
Pour expliquer ce qui se passe ici, CenterRandom génère une sorte de courbe en cloche. Cette fonction décompose l'avion en plusieurs courbes en cloche, une par paire de points existants. Le sélecteur nous indique à partir de quelle courbe de cloche générer. Étant donné que nous choisissons linéairement, nous pouvons nous assurer que les paires avec des écarts plus importants entre elles seront choisies plus souvent, mais nous laissons tout de même complètement aléatoire.
J'espère que ça vous indique la bonne direction.