2009-10-14 10 views
3

Je me demande ce que signifie cette ligne de code?Que signifie cette ligne de code?

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

Le gren_rand_uniform() est une fonction aléatoire pour générer des nombres 0 et 1. Cependant, je n'ai pas la signification pour >0.5 et 1:0.

Je sais que c'est censé être une question fondamentale, s'il vous plaît ours avec moi.

Merci!

Répondre

11

C'est un raccourci. Dans l'exemple que vous avez donné, il est équivalent à:

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

Depuis gen_rand_uniform() génère probablement uniformément répartis entre les nombres aléatoires 1 et 0, il y a une chance de 50% de la valeur étant supérieure à 0,5. Ce qui signifie qu'il y a 50% de chances d'obtenir un 1 ou un 0

+0

merci pour la réponse! Cela a éclairci les choses pour moi. –

+0

Ce n'est pas un raccourci, et ce n'est pas exactement équivalent - c'est en fait une construction distincte. Cela peut être facilement vu en utilisant des expressions ternaires imbriquées, et en regardant dans quel ordre elles sont évaluées, de gauche à droite ou vice versa. Bien sûr, certains pourraient dire que se comporter d'une autre manière que celle d'un 'équivalent' si/autre contstruct doit être un bug. –

+0

Merci pour votre contribution; J'ai quelque peu qualifié ma réponse. –

3

C'est un moyen d'obtenir une valeur aléatoire qui est 1 ou zéro, chaque fois 50% du temps. Le "?" et ":" sont les conditional operarator.

3

C'est arrondi. La variable b sera 0 ou 1.

1

Il code pour un retournement de pièce. (Une pièce parfaitement équilibrée qui est.)

12

Je ne pense pas que get_rand_uniform() fasse ce que vous pensez. Cela ressemble probablement à ceci:

float get_rand_uniform(void); 

Ou peut-être double. Le point est, il renvoie une décimale aléatoire nombre entre 0 et 1. Donc ceci:

get_rand_uniform() > 0.5 

un chèque pour voir si ce nombre est plus proche de 1 ou 0. Et ceci:

x ? y : z 

est l'opérateur conditionnel ternaire, qui sert la même fonction que celle-ci:

if(x) { y } else { z } 

Sauf que l'opéra ternaire tor est une expression . Donc tout cela:

get_rand_uniform() > 0.5 ? 1 : 0 

est arrondi essentiellement le nombre de virgule flottante aléatoire à 1 ou 0, et ceci:

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

Affecte que 1 ou choisis au hasard 0-b. Je crois que les parenthèses ne sont pas nécessaires ici, mais si vous les aimez, allez-y.

+0

Merci pour l'explication détaillée. M'a vraiment aidé :) –

0

Conditional assignment:

variable = condition ? value_if_true : value_if_false; 

qui est égal à:

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

Le code que vous nous donnez est juste bool aléatoire. Il retournera 1 ou 0.

0

Ce que vous voyez ici est un ternary expression. http://en.wikipedia.org/wiki/Ternary_operation Ceci est (comme d'autres l'ont souligné ici) une construction conditionnelle, mais spécifique aux expressions, ce qui signifie qu'une valeur est retournée.

Cette construction existe dans la plupart des langues (. Mais pas par exemple VB.Net) et a la forme d'

condition ? valueiftrue: valueiffalse 

Un exemple de ceci en action est:

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

Notez également que la condition peut être n'importe quelle expression (comme dans votre cas gen_rand_uniform() > 0.5) et peut contenir une expression ternaire imbriquée, tout ce qu'elle a à faire est d'évaluer comme une valeur non-fausse.