Pikirkan perbedaan antara 1 dadu dan 3 dadu . 1 Dadu memberi Anda probabilitas genap untuk semua nilai, sedangkan 3 dadu cenderung memiliki probabilitas lebih tinggi untuk nilai-nilai ke arah tengah.
Semakin banyak "dadu" dalam persamaan Anda, semakin kuat peluang Anda untuk mendapatkan sesuatu ke tengah. Jadi mari kita mendefinisikan fungsi yang dapat menangani angka apa pun secara merata :
// 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;
}
Sekarang kita dapat mendefinisikan fungsi contoh untuk menggunakan ini:
// 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
}
}
Sekarang yang pertama dicatat adalah bahwa kode ini benar-benar tidak memeriksa apakah pemilih sudah cocok dengan salah satu poin. Jika ya maka itu tidak akan menghasilkan poin, mungkin sesuatu yang mungkin Anda sukai.
Untuk menjelaskan apa yang terjadi di sini adalah bahwa CenterRandom menghasilkan semacam kurva lonceng. Fungsi ini memecah pesawat menjadi beberapa kurva lonceng, satu per pasang poin yang ada. Pemetik memberi tahu kami kurva lonceng mana yang akan dihasilkan. Karena kami memilih secara linear, kami dapat memastikan bahwa pasangan dengan celah yang lebih besar di antara mereka akan dipilih lebih sering, tetapi kami masih membiarkannya sepenuhnya acak.
Semoga ini menunjukkan Anda ke arah yang benar.