Путем Вы берете длину чего-либо, для которого это имеет смысл (список, словарь, кортеж, строка...) должен звонить len
на нем.
l = [1,2,3,4]
s = 'abcde'
len(l) #returns 4
len(s) #returns 5
причина "странного" синтаксиса состоит в том, что внутренне Python переводит len(object)
в object.__len__()
. Это относится к любому объекту. Так, если Вы определяете некоторый класс, и имеет смысл для него иметь длину, просто определить __len__()
метод на нем, и затем можно звонить len
на тех экземплярах.
Потому что вы не останавливаете функцию на этом. четвертая строка должна выглядеть так:
return pickServer();
Ответ на ваш вопрос, как указали другие, заключается в том, что ваш код проваливается без возврата. Если 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, что является эквивалентным решением.
Другой способ сделать это - использовать do… while
:
function pickServer() {
do {
$varr = rand(1,4);
} while ($varr == 2);
return $varr;
}
Я бы хотел примерно так:
function pickServer()
{
$servers = array(1,3,4);
return $servers[rand(1,count($servers))];
}
Потому что, когда значение равно 2, вы не возвращаете pickserver. И функция продолжает возвращать $ varr.
Вы, вероятно, захотите
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;
}
function pickServer(){
$varr = rand(1,4);
if($varr==2){
return pickServer(); //leave here
}
return $varr;
}
Я предполагаю, что вы используете VMR с несколькими входными контактами. VMR будет рендерить на одну поверхность, которая должна быть на одном дисплее. Вы должны иметь возможность рендерить свои потоки в несколько VMR, при этом каждая VMR размещается на отдельном дисплее в вашем развернутом окне.
Похоже, у вас есть все потоки на одном графике. Вы можете разделить их на разные графики, каждый из которых имеет один источник и одно средство визуализации. Синхронный запуск графиков означает использование IMediaFilter :: Run вместо IMediaControl :: Run:
Вы забыли вернуть значение ...
function pickServer(){
$varr = rand(1,4);
if($varr==2){
return pickServer();
}
return $varr;
}
Вы можете удалить рекурсию и вернуть случайно выбранное 2. Просто уменьшите диапазон и нанесите начало диапазона (в данном случае 2) на карту 1.
function pickServer(){
$varr = rand(2,4);
if($varr==2){
return 1;
}
return $varr;
}