2012-02-04 3 views
3

Я хочу использовать wolframalpha, чтобы найти вероятность того, что линия y = a x + b проходит через point [2,8], когда a и b определяются методом сверления справедливой кости.Почему эта замена выражения не работает?

Это делает то, что я хочу:

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

, но мне не нравится повторение. Я не совсем уверен, почему следующее не будет работать:

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

Могу ли я обойти это и что происходит?

+0

Маргус, если у вас есть более * Mathematica * вопросы, связанные я рекомендую вам присоединиться к нам на http://mathematica.stackexchange.com - это гораздо более активны, чем StackOverflow (для тега mathematica), и вы получите лучшие ответы раньше. –

+0

Margus: Уровень PE 12. Молодец! –

ответ

4

Порядок оценки в это не то, что вы хотите:

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

Левая сторона /. оценивает до замены, и поэтому становится: Indeterminate

Вам нужно отложить оценку. Обычный метод для этого - использовать «чистую функцию». См Function & и Slot #:

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

можно заставить ReplaceAll (короткая форма /.) работать, но это нестандартно:

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

Unevaluted здесь держит левую от оценки преждевременно.

+0

интересное использование 'Unevaluated'. Я думал, что вам придется делать «Hold» и «ReleaseHold», чтобы заставить их работать. ... но, конечно, это не так :) ... иногда вам просто нужно увидеть, как он работает, чтобы знать, что делать –

+0

@Mike, по общему признанию, «Unevaluated» довольно непредсказуем. См. Комментарии Леонида к [этому вопросу.] (Http://stackoverflow.com/a/5723277/618728) –

+0

Должен признаться, я ожидал, что выражение останется неоценимым. Я не очень хорошо работаю с имеющимися и неоценимыми выражениями, и из-за этого, как правило, нет интуитивного чувства к нему. 'With' с' HoldForm' примерно так же изощрен, как и я :) –

3

Причина, по которой возникает ошибка, заключается в том, что x не имеет значения и Length[x] возвращает ноль. Что вам нужно сделать, это определить х:

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

И это еще один способ сделать это. –

+1

... а также использовать с: 'С [{x = ...}, Count [x, 8]/Length [x]]' – kkm