anonymous function with rng call inside
Mostra commenti meno recenti
I would like to have a time domain function that uses a random number, but is stable over an interval. The anonymous function below does this, but it is not elegant.
f = @(t) {rng(ceil(t/10)), rand(1)}; % returns new random numbers each decade of t
f(2)
ans =
1×2 cell array
{1×1 struct} {[0.4170]}
The random number in second cell is what I want, but it can only be accessed through another variable. Is there a way in Matlab to simply return the random number without all the indirection?
Thank you for any help you can offer.
7 Commenti
William Buller
il 22 Ago 2026 alle 16:15
Paul
il 22 Ago 2026 alle 16:20
Are there bounds on t?
Matt J
il 22 Ago 2026 alle 16:36
f = @(t) isstruct(rng(ceil(t/10)))*rand(1);
Not a good idea. You are assuming sub-expressions in the function are evaluated left-to-right. That is not reliable.Why does the function have to be anonymous?
Walter Roberson
il 22 Ago 2026 alle 20:20
MATLAB has a well-defined order of operations, that mostly guarantees left-to-right operations (as modified by the operation precedences, that leads to oddities like c^a^b ). The main exception is the vaguely-documented linear algebra exceptions where for example a'*b might be specially evaluated rather than being evaluated as (a')*b
Matt J
il 23 Ago 2026 alle 4:50
@Walter Roberson The order of operations is left-to-right, but not the order of computation of the operands.
Evidence?
format long g
e('+left',3)+e('+center',4)+e('+right',2)
e('*left',3)*e('*center',4)*e('*right',2)
e('.*left',3).*e('.*center',4).*e('.*right',2)
e('.^-left',3).^-e('.^-center',4).^-e('.^-right',2)
e('&&left',3)&&e('&¢er',4)&&e('&&right',2)
e('|&left',3)|e('|¢er',4)&e('|&right',2)
function v = e(where,v)
disp(where);
end
Paul
il 23 Ago 2026 alle 12:38
Is there any documentation that prescribes the order of computation of the operands for an arithmetic operator? I can't find it, and therefore wouldn't assume any specific behavior.
I was curious about other languages. The AI result (whatever that's worth) from google for C was:
"In C, the order of evaluation for operands of most operators is unspecified. The compiler can evaluate them in any order it wants.
...
Important Rules to Remember
- No general left-to-right rule: For normal binary operators like + or -, f1() + f2() does not guarantee that f1() runs first.
- Function arguments: The order of evaluation for function arguments is also unspecified."
Related discussion here Is the Order of Function Evaluation Guaranteed when Function Outputs are Concatenated into an an Array? - MATLAB Answers - MATLAB Central on order of computation when constructing matrices via concatenation, which also includes discussion on order of computation of operands in expressions with arithmetic operators.
Risposta accettata
Più risposte (4)
function y=f(t)
rng(ceil(t/10));
y=rand(1);
end
t = 2*(rand(1,1000)-0.5)*100;
figure
plot(t,f(t,10),'b.',t,f(t,10),'r.')
function y = f(t,interval)
tinterval = ceil(t/interval);
[C,ia,ic] = unique(tinterval);
yout = rand(size(C));
y = yout(ic);
end
Matt J
il 22 Ago 2026 alle 16:48
rng('default')
T= rand(1,10);
t=1:15;
T(ceil(t/10))
ans =
Columns 1 through 9
0.8147 0.8147 0.8147 0.8147 0.8147 0.8147 0.8147 0.8147 0.8147
Columns 10 through 15
0.8147 0.9058 0.9058 0.9058 0.9058 0.9058
Steven Lord
il 23 Ago 2026 alle 2:48
Modificato: Steven Lord
il 23 Ago 2026 alle 5:51
But if you want to draw numbers from a random number generator with a particular seed value and they must be generated inside an anonymous function, without defining a "named" function, rng is not the right tool for this particular application. Use RandStream.create. This creates a temporary random number generator object from which you can draw numbers without affecting any other rand, randn, randi, etc. call.
f = @(t) rand(RandStream.create('twister', 'seed', t), 1, 2)
f(1)
f(2)
f(1)
rng(2, 'twister')
rand(1, 2) % Matches f(2)
rng(1, 'twister')
f(3) % doesn't affect the global generator [SL fixed typo]
rand(1, 2) % Matches f(1)
Categorie
Scopri di più su Numeric Types in Centro assistenza e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
