Как генерировать 100 рандомов float
между -1
и 1
с основным распределением между -0.1
до 0.1
(90% чисел с плавающей точкой должны находиться между -0.1
до 0.1
). В настоящее время я использую то, что не совсем то, что я хочу
for (int counter = 0; counter < 100; counter++)
{
randomnum = 0f;
randomnum = Convert.ToSingle(randomvalues.NextDouble() / 10);
storerandomvalues1[counter] = randomnum;
}
Есть идеи?
Это должно сработать. Он генерирует одно случайное число, чтобы выбрать, находится ли вы в диапазоне -0.1,0.1, а затем секунда, которая расширяется до фактического диапазона, в котором вы хотите. Вы можете сделать это только с одним случайным double
, но это будет упростить получение кода, и труднее читать (все для небольшого улучшения производительности).
for (var counter = 0; counter < 100; counter++)
{
int selector = randomvalues.Next(10); // 0 <= selector < 10
double randomnum;
if (selector < 9)
{
randomnum = randomvalues.NextDouble() * 0.2 - 0.1;
}
else
{
randomnum = randomvalues.NextDouble() * 1.8 - 0.9;
randomnum += Math.Sign(randomnum) * 0.1;
}
storerandomvalues1[counter] = (float)randomnum;
}
Как я уже сказал в комментарии, существует бесконечное число возможных решений. Возможны два возможных решения:
Нормальное (ака-гауссовское) распределение со средним значением 0 и стандартным отклонением 0,06079 будет иметь 90% его результатов между -0.1 и +0.1, поэтому генерирует стандартную норму и умножает ее на 0,06079. Технически вы должны проверить, превышает ли абсолютное значение 1, но это соответствует получению результатов по 16 сигмам - этого просто не произойдет.
Однако вам может не понравиться решение, потому что оно не будет охватывать весь диапазон на практике. Вариант, который будет X < -0.1
в том, чтобы генерировать X
как описано в предыдущем абзаце, и если X < -0.1
, замените его на Uniform (-1, -0.1). Аналогично, если X > 0.1
, замените его на Uniform (0,1, 1).
Я реализовал оба из них, сгенерировал 100 000 значений, и вот гистограммы:
Обратите внимание, что 5- й и 95- й кванты являются -0.0998 и +0.09971 соответственно эффективно -0.1 и +0.1 с ошибкой выборки.
использовать функцию журнала, генерировать поплавки от 1 до 10, а затем взять базу 10 результатов. затем случайным образом измените знак.
Попробуйте это, он должен работать...
Random rnd = new Random();
for (int counter = 0; counter < 100; counter++)
{
storerandomvalues1[counter]=(2*rnd.NextDouble())-1; // Exact Sample() is protected so u can use NextDouble()
}
Sample()
помечен как protected
? msdn.microsoft.com/en-us/library/system.random.sample.aspx