2009-10-14 5 views
3

Мне интересно, что означает эта строка кода?Что означает эта строка кода?

b = (gen_rand_uniform()>0.5)?1:0; 

The gren_rand_uniform() является функцией для генерации случайных 0 и 1 чисел. Однако я не понимаю значения для >0.5 и 1:0.

Я знаю, что это должен быть основной вопрос, пожалуйста, несите меня.

Спасибо!

ответ

11

Это стенография. В примере вы дали, это эквивалентно:

if (gen_rand_uniform() > 0.5) { 
    b = 1; 
} else { 
    b = 0; 
} 

Так как gen_rand_uniform() вероятно, генерирует равномерно распределенных случайных чисел между 1 и 0, есть шанс 50% от стоимости выше, чем 0,5. Это означает, что существует 50% вероятность получить 1 или 0

+0

благодарит за ответ! Это прояснилось для меня. – 2009-10-14 19:44:33

+0

Его не стенография, а ее не совсем эквивалентная - это фактически отдельная конструкция. Это наиболее легко увидеть при использовании вложенных тернарных выражений, а также в том, в каком порядке они оцениваются, слева направо или наоборот. Конечно, некоторые могут сказать, что поведение в любом другом виде, чем в случае «эквивалентного», если/else contstruct должно быть ошибкой. –

+0

Спасибо за ваш вклад; Я несколько квалифицировал свой ответ. –

3

Это способ получить случайное значение, которое равно 1 или нулю, каждые 50% времени. «?» и ":" - conditional operarator.

3

Это округление. Значение переменной b будет либо 0, либо 1.

1

Он кодирует переворот монеты. (Совершенно сбалансированная монета, которая есть.)

12

Не думаю, что get_rand_uniform() делает то, что вы думаете. Это, вероятно, выглядит следующим образом:

float get_rand_uniform(void); 

Или, может быть double. Дело в том, что возвращает случайное десятичного числамежду 0 и 1. Таким образом:

get_rand_uniform() > 0.5 

ли проверка, чтобы убедиться, что число ближе к 1 или 0. И это:

x ? y : z 

Является ли тройная условный оператор, который выполняет ту же функцию, как это:

if(x) { y } else { z } 

Кроме того, что тройной оперы tor - выражение . Так что все это:

get_rand_uniform() > 0.5 ? 1 : 0 

в основном округляя случайное число с плавающей запятой в 1 или 0, а это:

b = get_rand_uniform() > 0.5 ? 1 : 0; 

Правопреемникам, которые случайным образом выбраны 1 или 0 в b. Я считаю, что скобки здесь не нужны, но если они вам нравятся, пойдите для этого.

+0

Спасибо за подробное объяснение. Действительно помог мне :) – 2009-10-14 19:46:10

0

Conditional assignment:

variable = condition ? value_if_true : value_if_false; 

который равен:

if (condition) { 
    variable = value_if_true; 
} else { 
    variable = value_if_false; 
} 

код, который вы дадите нам просто случайное BOOL. Он вернет либо 1, либо 0.

0

Что вы видите здесь, это ternary expression. http://en.wikipedia.org/wiki/Ternary_operation Это (как указывали другие здесь) условная конструкция, но такая, которая специфична для выражений, что означает, что возвращается значение.

Эта конструкция существует в большинстве языков (., Но не, например, VB.Net) и имеет вид

condition ? valueiftrue: valueiffalse 

Примером этого в действии:

var foo = true; 
var bar = foo ? 'foo is true' : 'foo is false'; 
// bar = 'foo is true' 

Также отметим, что условие может быть любым выражением (например, в вашем случае gen_rand_uniform() > 0.5) и может иметь инфорт, содержащий вложенное тернарное выражение, все, что ему нужно сделать, - это оценить как недействительное значение.

Смежные вопросы