Hãy nghĩ về sự khác biệt giữa 1 con xúc xắc và 3 con xúc xắc . 1 Dice cung cấp cho bạn một xác suất đồng đều cho tất cả các giá trị, trong khi 3 súc sắc sẽ có xu hướng có xác suất cao hơn cho các giá trị ở giữa.
Càng nhiều "xúc xắc" trong phương trình của bạn, cơ hội của bạn để có được một cái gì đó về phía trung tâm càng mạnh mẽ. Vì vậy, hãy xác định một hàm có thể xử lý đồng đều bất kỳ số nào :
// 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;
}
Bây giờ chúng ta có thể định nghĩa một hàm ví dụ để sử dụng điều này:
// 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
}
}
Bây giờ điều đầu tiên cần lưu ý là mã này thực sự không kiểm tra xem bộ chọn có khớp với một trong các điểm không. Nếu vậy thì nó sẽ không tạo ra một điểm, có thể là thứ bạn có thể thích.
Để giải thích những gì đang diễn ra ở đây là CenterRandom tạo ra một đường cong hình chuông. Hàm này chia mặt phẳng thành nhiều đường cong hình chuông, mỗi điểm cho một cặp điểm. Bộ chọn cho chúng ta biết đường cong hình chuông nào sẽ được tạo ra. Vì chúng tôi chọn tuyến tính, chúng tôi có thể đảm bảo rằng các cặp có khoảng cách lớn hơn giữa chúng sẽ được chọn thường xuyên hơn, nhưng chúng tôi vẫn để nó hoàn toàn ngẫu nhiên.
Hy vọng điều này chỉ cho bạn đi đúng hướng.