Расширить случайный диапазон от 1–5 до 1–7 - PullRequest
679 голосов
/ 26 сентября 2008

Учитывая функцию, которая производит случайное целое число в диапазоне от 1 до 5, напишите функцию, которая производит случайное целое число в диапазоне от 1 до 7.

  1. Что такое простое решение?
  2. Каково эффективное решение для уменьшения использования памяти или работы на более медленном процессоре?

Ответы [ 76 ]

0 голосов
/ 06 апреля 2012

Почему бы вам просто не разделить на 5 и умножить на 7, а затем округлить? (Конечно, вы должны будете использовать число с плавающей запятой)

Это намного проще и надежнее (правда?), Чем другие решения. Например. в Python:

def ranndomNo7():
    import random
    rand5 = random.randint(4)    # Produces range: [0, 4]
    rand7 = int(rand5 / 5 * 7)   # /5, *7, +0.5 and floor()
    return rand7

Разве не так просто?

0 голосов
/ 30 апреля 2009

Решение с постоянным временем, которое обеспечивает приблизительно равномерное распределение. Хитрость в том, что 625 получается делимым на 7, и вы можете получить равномерное распределение при увеличении до этого диапазона.

Редактировать: Мой плохой, я просчитался, но вместо того, чтобы тянуть его, я оставлю его на тот случай, если кто-то посчитает это полезным / интересным. Это действительно на самом деле работает в конце концов ...:)

int rand5()
{
    return (rand() % 5) + 1;
}

int rand25()
{ 
    return (5 * (rand5() - 1) + rand5());
}

int rand625()
{
    return (25 * (rand25() - 1) + rand25());
}

int rand7()
{
    return ((625 * (rand625() - 1) + rand625()) - 1) % 7 + 1;
}
0 голосов
/ 24 августа 2018

Это ответ, который я придумал, но эти сложные ответы заставляют меня думать, что это совсем не так /:))

import random

def rand5():
    return float(random.randint(0,5))

def rand7():
    random_val = rand5()
    return float(random.randint((random_val-random_val),7))

print rand7()
0 голосов
/ 02 сентября 2013

Этого выражения достаточно, чтобы получить случайные целые числа от 1 до 7

int j = ( rand5()*2 + 4 ) % 7 + 1;
0 голосов
/ 17 мая 2019

// returns random number between 0-5 with equal probability
function rand5() {
  return Math.floor(Math.random() * 6);
}

// returns random number between 0-7 with equal probability
function rand7() {
  if(rand5() % 2 == 0 && rand5() % 2 == 0) { 
    return 6 + rand5() % 2;
  } else {
    return rand5();
  }
}

console.log(rand7());
0 голосов
/ 03 мая 2009

Я поиграл и написал "Среда тестирования" для этого алгоритма Rand (7). Например, если вы хотите попробовать, какое распределение дает ваш алгоритм или сколько итераций требуется для генерации всех различных случайных значений (для Rand (7) 1-7), вы можете использовать его .

Мой основной алгоритм такой:

return (Rand5() + Rand5()) % 7 + 1;

Ну не менее равномерно, чем у Адама Розенфилда. ( который я включил в мой код фрагмента )

private static int Rand7WithRand5()
{
    //PUT YOU FAVOURITE ALGORITHM HERE//

    //1. Stackoverflow winner
    int i;
    do
    {
        i = 5 * (Rand5() - 1) + Rand5(); // i is now uniformly random between 1 and 25
    } while (i > 21);
    // i is now uniformly random between 1 and 21
    return i % 7 + 1;

    //My 2 cents
    //return (Rand5() + Rand5()) % 7 + 1;
}

Эта «среда тестирования» может принимать любой алгоритм Rand (n), тестировать и оценивать его (распределение и скорость). Просто вставьте свой код в метод Rand7WithRand5 и запустите фрагмент.

Несколько замечаний:

  • Алгоритм Адама Розенфилда не лучше, чем, например, мой. В любом случае, распределение обоих алгоритмов ужасно.
  • Собственный Rand7 (random.Next(1, 8)) завершен, поскольку он сгенерировал все члены в заданном интервале примерно за 200 итераций, алгоритмы Rand7WithRand5 принимают порядок 10k (около 30-70k)
  • Реальная задача не состоит в том, чтобы написать метод для генерации Rand (7) из Rand (5), но он генерирует значения, более или менее равномерно распределенные.
...