Возвратите Случайное число, но не 2

Путем Вы берете длину чего-либо, для которого это имеет смысл (список, словарь, кортеж, строка...) должен звонить len на нем.

l = [1,2,3,4]
s = 'abcde'
len(l) #returns 4
len(s) #returns 5

причина "странного" синтаксиса состоит в том, что внутренне Python переводит len(object) в object.__len__(). Это относится к любому объекту. Так, если Вы определяете некоторый класс, и имеет смысл для него иметь длину, просто определить __len__() метод на нем, и затем можно звонить len на тех экземплярах.

5
задан Nosredna 19 August 2009 в 16:38
поделиться

10 ответов

Потому что вы не останавливаете функцию на этом. четвертая строка должна выглядеть так:

return pickServer();
19
ответ дан 18 December 2019 в 05:11
поделиться

Ответ на ваш вопрос, как указали другие, заключается в том, что ваш код проваливается без возврата. Если 2 возвращается вызовом rand () как при первой попытке , так и при второй попытке (вероятность этого составляет 1/16), вы получите 2 .

Но ваш подход к решению проблемы может быть лучше.

И рекурсия, и цикл не подходят для этой проблемы. Это проблема отображения , а не проблема случайности . (Это похоже на некоторые общие задачи собеседования с кодированием случайности, которые легче всего решить в цикле отклонения, но на самом деле это не проблема этого класса.)

Вам нужен один из трех результатов, а не четыре . (1, 3 и 4. Это означает, что вы должны создать диапазон из трех случайных чисел, а не из четырех. Вы можете переназначить массив или использовать if . Обе возможности показаны ниже. Сообщите мне, если у меня неправильный синтаксис - мой PHPfu сегодня утром слаб.

/* array remapping */
function pickServer() {
    $remap = array(1, 3, 4);
    return $remap[rand(1,3)];
}

/* if remapping */
function pickServer() {
    $server = rand(1,3);
    if ($server==2) {
        $server=4;
    }
    return $server;
}

Я не замечал этого раньше, но balpha ожидал моего ответа. Он переназначил if во втором примере. Вместо переназначения 2 на 4 он просто добавил единицу к любому ответу выше 1, что является эквивалентным решением.

26
ответ дан 18 December 2019 в 05:11
поделиться

Другой способ сделать это - использовать do… while :

function pickServer() {
    do {
        $varr = rand(1,4);
    } while ($varr == 2);
    return $varr;
}
13
ответ дан 18 December 2019 в 05:11
поделиться

Я бы хотел примерно так:

function pickServer()
{
$servers = array(1,3,4);
return $servers[rand(1,count($servers))]; 
}
1
ответ дан 18 December 2019 в 05:11
поделиться

Потому что, когда значение равно 2, вы не возвращаете pickserver. И функция продолжает возвращать $ varr.

2
ответ дан 18 December 2019 в 05:11
поделиться

Вы, вероятно, захотите

function pickServer(){
  $varr = rand(1,4);
  if($varr==2){
    $varr = pickServer();
  }
  return $varr;
}

- но учтите, что нет гарантии, что это не приведет к слишком длинной рекурсии. Возможно, вам лучше сделать что-то вроде этого:

function pickServer(){
  $varr = rand(1,3);
  if($varr > 1){
    $varr = $varr + 1;
  }
  return $varr;
}
10
ответ дан 18 December 2019 в 05:11
поделиться
function pickServer(){
    $varr = rand(1,4);
    if($varr==2){
        return pickServer(); //leave here
    }
    return $varr;
}
2
ответ дан 18 December 2019 в 05:11
поделиться

Я предполагаю, что вы используете VMR с несколькими входными контактами. VMR будет рендерить на одну поверхность, которая должна быть на одном дисплее. Вы должны иметь возможность рендерить свои потоки в несколько VMR, при этом каждая VMR размещается на отдельном дисплее в вашем развернутом окне.

Похоже, у вас есть все потоки на одном графике. Вы можете разделить их на разные графики, каждый из которых имеет один источник и одно средство визуализации. Синхронный запуск графиков означает использование IMediaFilter :: Run вместо IMediaControl :: Run:

  • Выберите один график в качестве главного.
  • Убедитесь, что у мастера есть часы. Обычно это делается при переходе в активное состояние, но вы можете заставить это произойти раньше, вызвав SetDefaultSyncSource на графике.
  • Запросите у графиков IMediaFilter,
0
ответ дан 18 December 2019 в 05:11
поделиться

Вы забыли вернуть значение ...

function pickServer(){
$varr = rand(1,4);
if($varr==2){
    return pickServer();
}
return $varr;
}
0
ответ дан 18 December 2019 в 05:11
поделиться

Вы можете удалить рекурсию и вернуть случайно выбранное 2. Просто уменьшите диапазон и нанесите начало диапазона (в данном случае 2) на карту 1.

function pickServer(){
    $varr = rand(2,4);
    if($varr==2){
        return 1;
    }
    return $varr;
}
0
ответ дан 18 December 2019 в 05:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: