У меня есть массив двойных значений "vals", мне нужно случайным образом проиндексировать этот массив и получить значение. GenRandomNumber () возвращает число от 0 до 1, но никогда не 0 или 1. Я использую Convert.ToInt32, чтобы в основном получить все слева от моего десятичного знака, но должен быть более эффективный способ сделать это?
Вот мой код:
public double GetRandomVal()
{
int z = Convert.ToInt32(GenRandomNumber() * (vals.Length));
return vals[z];
}
Спасибо
Обновление
Спасибо всем, кто ответил, но я вынужден использовать предоставленную реализацию MersenneTwister для случайных чисел, которая имеет метод rand.NextDouble ()
Обновление 2
Подумав еще об этом, все, что мне нужно сделать, это генерировать случайное число от 0 до array.length-1, а затем использовать его для случайной индексации в массиве . длина vals составляет 2 ^ 20 = 1048576, поэтому генерации случайного числа int достаточно. Я заметил, что у моего MersenneTwister есть метод:
public int Next(int maxValue)
Если я назову это как vals [rand.Next (vals.length-1)] что должно сделать это правильно? Я также вижу, что у MersenneTwister есть конструктор:
public MersenneTwister(int[] init)
Не уверен, для чего это нужно, могу ли я использовать это для предварительного заполнения допустимых случайных чисел, для которых я предоставляю массив от 0 до vals.length?
FYI vals - это двойной массив длиной 1048576, разделяющий кривую нормального распределения. Я в основном использую этот механизм для создания нормально распределенных чисел как можно быстрее, в симуляции Монте-Карло используются миллиарды нормально распределенных случайных чисел каждый день , так что каждый маленький кусочек помогает.