# Alternative to while loops without using loop?

20 ビュー (過去 30 日間)
Manne Plok 2018 年 9 月 5 日

Hi, are there any more efficient alternatives to while loops. eg
a = zeros(3,1,3);
b = ones(3,1,3);
while isequal(a,b) == 0
a(:,:,1) = [round(rand);round(rand);round(rand)];
a(:,:,2) = [round(rand);round(rand);round(rand)];
a(:,:,3) = [round(rand);round(rand);round(rand)];
b(:,:,1) = [round(rand);round(rand);round(rand)];
b(:,:,2) = [round(rand);round(rand);round(rand)];
b(:,:,3) = [round(rand);round(rand);round(rand)];
end
I

サインインしてコメントする。

### 回答 (2 件)

the cyclist 2018 年 9 月 5 日
a = zeros(3,1,3);
b = ones(3,1,3);
while not(isequal(a,b))
a = round(rand(3,1,3));
b = round(rand(3,1,3));
end
##### 4 件のコメント表示非表示 3 件の古いコメント
Steven Lord 2018 年 9 月 5 日
Another alternative would be to use randi specifying [0 1] as the first input.

サインインしてコメントする。

the cyclist 2018 年 9 月 5 日

Here is a way to do this without a while loop. It uses the trick I mentioned in a comment, that there are a finite number (512) ways of filling a 3x1x3 array with zeros and ones, and therefore there are 512x511 = 261,632 ways of choosing a pair of distinct entries.
In the code, I ...
• create the full list
• pick a at random
• delete that choice from the list
• pick b at random
list = dec2bin(0:511) - '0';
a_idx = randi(512);
a = reshape(list(a_idx,:),3,1,3);
list(a_idx,:) = [];
b_idx = randi(511);
b = reshape(list(b_idx,:),3,1,3);
The very first line is itself a pretty slick trick for getting all the permutations.

サインインしてコメントする。

R2017b

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!