Search All of the Math Forum:

Views expressed in these public forums are not endorsed by NCTM or The Math Forum.

Notice: We are no longer accepting new posts, but the forums will continue to be readable.

Topic: Table with condition
Replies: 1   Last Post: Mar 26, 2013 4:05 AM

 Messages: [ Previous | Next ]
 Bill Rowe Posts: 1,647 Registered: 3/14/08
Re: Table with condition
Posted: Mar 26, 2013 4:05 AM

On 3/24/13 at 11:23 PM, Serych@panska.cz wrote:

>Dear mathgroup, I need to start creating list and continue until
>some condition is not met. For example to generate list of random
>numbers until the value is not 5. Yes, it is theoreticaly possible
>to generate list with sufficient length, and cut it on the right
>place afterwords, but it is very inefficient way if the computation
>is much harder than just generation of random numbers.

>TakeWhile[Table[RandomInteger[{0, 10}], {15}], # != 5 &]

>Using the while cycle is the other way, but I can only print values
>using that method, but I don't know, how to generate classical list:

>r = 0; While[r != 5, r = RandomInteger[{0, 10}]; Print[r]]

>What is the right solution of such a simple problem?

What you might want to use is NestWhileList. Using your example
of RandomInteger you could do it as:

In[9]:= Most@
NestWhileList[(#; RandomInteger[{0, 10}]) &,
RandomInteger[{0, 10}], (# != 5) &]

Out[9]= {4,8,10,3,9,6,4,0,6,3,2,1,7,7,4,8,3,2}

What might be more efficient when each result really doesn't
depend on the previous result could be something like:

In[16]:= list = {}; r = 0;
While[r != 5, list = {list, r = RandomInteger[{0, 10}]}];
Most@Flatten[list]

Out[18]= {2,9,9,0,6,4,0,0,7,7,4,7}

Note, the issue of whether to generate a list of random integers
then use TakeWhile isn't just a question of efficiency. No
matter what length list you generate, there is always some
probability of it not having a 5. By pre-selecting the list
length you eliminate the possibility of having longer lists
which could occur.

Date Subject Author
3/24/13 Jakub Serych
3/26/13 Bill Rowe