генерировать случайное число с плавающей точкой в C #

1

Как генерировать 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;
}

Есть идеи?

Теги:
random

4 ответа

3
Лучший ответ

Это должно сработать. Он генерирует одно случайное число, чтобы выбрать, находится ли вы в диапазоне -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

Как я уже сказал в комментарии, существует бесконечное число возможных решений. Возможны два возможных решения:

  1. Нормальное (ака-гауссовское) распределение со средним значением 0 и стандартным отклонением 0,06079 будет иметь 90% его результатов между -0.1 и +0.1, поэтому генерирует стандартную норму и умножает ее на 0,06079. Технически вы должны проверить, превышает ли абсолютное значение 1, но это соответствует получению результатов по 16 сигмам - этого просто не произойдет.

  2. Однако вам может не понравиться решение, потому что оно не будет охватывать весь диапазон на практике. Вариант, который будет X < -0.1 в том, чтобы генерировать X как описано в предыдущем абзаце, и если X < -0.1, замените его на Uniform (-1, -0.1). Аналогично, если X > 0.1, замените его на Uniform (0,1, 1).

Я реализовал оба из них, сгенерировал 100 000 значений, и вот гистограммы:

Изображение 174551

Обратите внимание, что 5- й и 95- й кванты являются -0.0998 и +0.09971 соответственно эффективно -0.1 и +0.1 с ошибкой выборки.

-1

использовать функцию журнала, генерировать поплавки от 1 до 10, а затем взять базу 10 результатов. затем случайным образом измените знак.

  • 0
    Какое распределение вы предлагаете для чисел с плавающей запятой, потому что оно не дает 90% ниже 0,1 для равномерного распределения.
  • 0
    Я думал, что если случайные числа, сгенерированные на шаге 1, равномерно распределены между 1 и 10, то взятие логарифмической базы 10 должно привести к тому, что все значения от 1 до 9 (которые должны составлять 90%) будут находиться в диапазоне от 0 до .1, и все значения между 9 и 10 должны в конечном итоге быть между .1 и .999999 - Возможно, вам придется немного поиграть с числами, чтобы это выровнялось должным образом, но концепция должна работать. В основном вам нужна функция, которая преобразует равномерное распределение значений в распределение с определенной формой. И функция Log - это форма, которую вы ищете.
Показать ещё 1 комментарий
-3

Попробуйте это, он должен работать...

   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()
    }
  • 2
    Это игнорирует запрос на нормальное распределение "90% чисел от -0,1 до 0,1"
  • 0
    Разве Sample() помечен как protected ? msdn.microsoft.com/en-us/library/system.random.sample.aspx
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню