2012-02-04 1 views
3

Je veux utiliser wolframalpha pour trouver la probabilité d'une ligne y = a x + b passe par le point [2,8], lorsque a et b sont déterminés par un jet de dés juste.Pourquoi cette substitution d'expression ne fonctionne-t-elle pas?

Cela fait ce que je veux:

Count[Flatten[Table[a 2 + b, {a,6},{b,6}]],8]/ 
Length[Flatten[Table[a 2 + b, {a,6},{b,6}]]] 

, mais je n'aime pas la répétition. Je ne suis pas entièrement certain pourquoi le suivant ne fonctionnera pas:

Count[x, 8]/Length[x] /. x -> Flatten[Table[a 2 + b, {a, 6}, {b, 6}]] 

Puis-je contourner ceci et que se passe-t-il?

+0

Margus, si vous avez plus * * Mathematica questions liées Je vous recommande de nous rejoindre sur http://mathematica.stackexchange.com - il est beaucoup plus actif que maintenant StackOverflow (pour le tag mathematica) et vous obtiendrez de meilleures réponses plus tôt. –

+0

Margus: PE niveau 12. Bravo! –

Répondre

4

L'ordre d'évaluation dans ce n'est pas ce que vous désirez:

Count[x, 8]/Length[x] /. x -> Flatten[Table[a 2 + b, {a, 6}, {b, 6}]] 

Le côté gauche de /. avant le remplacement évalue et devient donc: Indeterminate

Vous devez retarder l'évaluation. La méthode normale pour cela est d'utiliser une "fonction pure". Voir Function & et Slot #:

Count[#, 8]/Length[#] & @ Flatten[Table[a 2 + b, {a, 6}, {b, 6}]] 

Il est possible de forcer ReplaceAll (forme courte /.) au travail, mais il est non standard:

Unevaluated[ Count[x, 8]/Length[x] ] /. 
    x -> Flatten[Table[a 2 + b, {a, 6}, {b, 6}]] 

Unevaluted ici maintient le côté gauche de l'évaluation prématurément.

+0

utilisation intéressante de 'Unevaluated'. Je pensais que tu devrais faire un Hold et un ReleaseHold pour que ça marche. ... mais bien sûr ça ne marche pas :) ... parfois vous avez juste besoin de le voir courir pour savoir quoi faire –

+0

@Mike Certes 'Non évalué 'est plutôt imprévisible. Voir les commentaires de Leonid à [cette réponse.] (Http://stackoverflow.com/a/5723277/618728) –

+0

Je dois admettre que je m'attendais à ce que l'expression reste non évaluée. Je ne travaille pas avec autant d'expressions tenues et non évaluées et, à cause de cela, je n'ai pas de sens intuitif pour cela. 'With' avec' HoldForm' est à peu près aussi sophistiqué que j'obtiens :) –

3

La raison pour laquelle cela produit une erreur est que x n'a aucune valeur et Length[x] renvoie zéro. Ce que vous devez faire est de définir x:

x=Flatten[Table[a 2 + b, {a, 6}, {b, 6}]]; 
Count[x, 8]/Length[x] 
+0

Et c'est une autre façon de le faire. –

+1

... et aussi utiliser Avec: 'Avec [{x = ...}, compte [x, 8]/longueur [x]]' – kkm

Questions connexes