Плоская рулетка со случайным числом: получить интервал, в котором случайному принадлежит
Например у меня есть и массив с такими элементами:
0 21 29 0 0 50
давайте "сгладим" эти числа:
скажем, мое случайное число равно 54, поэтому мое число принадлежит к последнему элементу в моем массиве с индексом 6 (это 50)
я не могу понять, как это сделать... с помощью C#
я попробую:
Random random = new Random();
int randomNumber = random.Next(1, 100);
int temp, temp_ind;
float a_, b_;
for (j = 0; j < n-1; j++)
{
if (roulette[j] != 0)
{
temp_ind = j+1;
a_ = roulette[j];
while ((roulette[temp_ind] == 0.0) && (temp_ind < n-1))
{
temp_ind++;
}
b_ = roulette[temp_ind];
if ((a_ <= randomNumber) && (b_ >= randomNumber))
{
start = j;
break;
}
}
}
но это не работает, может быть, что-то может мне помочь?
2 ответа
Вот решение, которое преобразует массив в накопительный массив (используя метод расширения из этого ответа Эрика Липперта), а затем находит индекс первого совпадения в этом массиве, который больше, чем случайное число.
class Program
{
static void Main(string[] args)
{
var random = new Random();
int[] roulette = { 0, 21, 29, 0, 50 };
var cumulated = roulette.CumulativeSum().Select((i, index) => new { i, index });
var randomNumber = random.Next(0, 100);
var matchIndex = cumulated.First(j => j.i > randomNumber).index;
Console.WriteLine(roulette[matchIndex]);
}
}
public static class SumExtensions
{
public static IEnumerable<int> CumulativeSum(this IEnumerable<int> sequence)
{
int sum = 0;
foreach (var item in sequence)
{
sum += item;
yield return sum;
}
}
}
У вас безнадежно слишком много переменных, что усложняет проблему. Помимо счетчика и числа, вам нужна только одна дополнительная переменная, чтобы отслеживать ближайший меньший номер.
Ниже приведен некоторый код, который я написал по сути с той же идеей, просто он кажется немного проще.
int[] roulette = {0, 21, 29, 0, 0, 50};
int closest = -1;
int number = 54;
for (int j = 0; j < roulette.Length; j++)
// if the values isn't 0 and it's smaller
// and we haven't found a smaller one yet, or this one's closer
if (roulette[j] != 0 && roulette[j] < number &&
(closest == -1 || roulette[j] > roulette[closest]))
{
closest = j;
}
if (closest == -1) // no smaller number found
Console.WriteLine(0);
else
Console.WriteLine(roulette[closest]);
Для повторных запросов было бы лучше отсортировать числа, а затем выполнить бинарный поиск, чтобы найти правильную позицию.