MicrochipHo Posted April 22, 2008 Report Share Posted April 22, 2008 Ok, Part of the assignment is to generate a number between 18 and 24, and then i want to return that number to a sub VI. What a I did is multiply the randome # generator by a 100, and then put a conditional if the number is greater than 18 and less than 24....can't return the actual value, because than the output is a boolean. There are examples of how to do this whole program on the internet, but I want to work with my own code. How do I get this to return the values in float precision? I know I sound lame but I am terrible at programming...but i am trying =( Quote Link to comment
Chris Davis Posted April 22, 2008 Report Share Posted April 22, 2008 QUOTE (MicrochipHo @ Apr 21 2008, 09:40 AM) I know I sound lame but I am terrible at programming...but i am trying =( Show us what you have tried, then we can help you. Quote Link to comment
TobyD Posted April 22, 2008 Report Share Posted April 22, 2008 QUOTE (MicrochipHo @ Apr 21 2008, 08:40 AM) Ok, Part of the assignment is to generate a number between 18 and 24, and then i want to return that number to a sub VI. What a I did is multiply the randome # generator by a 100, and then put a conditional if the number is greater than 18 and less than 24....can't return the actual value, because than the output is a boolean. There are examples of how to do this whole program on the internet, but I want to work with my own code. How do I get this to return the values in float precision? I know I sound lame but I am terrible at programming...but i am trying =( The random number generator generates a number between 0 and 1. You need to cover a range of 6 (24-18) so multiply the random number by 6 and you have a random number between 0 and 6. Now add 18 and you're there. Quote Link to comment
MicrochipHo Posted April 22, 2008 Author Report Share Posted April 22, 2008 QUOTE (Chris Davis @ Apr 21 2008, 04:42 PM) Show us what you have tried, then we can help you. Update: I tried doing this: two random # generators, one times 18, one times 24. Subtracted them, and returned that to a for loop (I disabled the indexing), and returned it to the Celsius to Farinheight. Am i going to have to put that into an array. What I want it to do is to stop collecting the 18-24 data and stop converting it, stop writing it to the array and etc... plan to do that with a while loop and/or case structure. .... Quote Link to comment
TobyD Posted April 22, 2008 Report Share Posted April 22, 2008 QUOTE (MicrochipHo @ Apr 21 2008, 08:40 AM) What a I did is multiply the randome # generator by a 100... If you want to stick with your original idea you can try something like this. Make sure you understand all the settings of In Range and Coerce. Download File:post-8758-1208794184.vi Quote Link to comment
mross Posted April 22, 2008 Report Share Posted April 22, 2008 QUOTE (MicrochipHo @ Apr 21 2008, 11:40 AM) Ok, Part of the assignment is to generate a number between 18 and 24, and then i want to return that number to a sub VI. What a I did is multiply the randome # generator by a 100, and then put a conditional if the number is greater than 18 and less than 24....can't return the actual value, because than the output is a boolean. There are examples of how to do this whole program on the internet, but I want to work with my own code. How do I get this to return the values in float precision? I know I sound lame but I am terrible at programming...but i am trying =( At least you are honest. Generally we don't lay out answers for people doing school work. But we will definitely give help if you have put in some effort yourself. If you are more verbal than mathematical try writing out the process in words, using phrases like: if this is so, then do response 1...if this is not so, then do response 2. This verbal function comes from the Case Structure. in LabVIEW. The responses are put within the Case Structure - True Case for when the test is so, and False when it is not so. In this example when you have tested the number and it meets your criteria you simply wire the same data you tested into the Case structure and out the far side in the TRUE case, but not in the false. The test is performed and the T or F drives which Case will run. All the case needs is the number to pass or reject. If the test is false since there is no data wire across the false case, then that number dies. If the case is TRUE then the data is wired through the TRUE case and you can pick it up on the output side of the Case to be dealt with as needed. Within the TRUE and false cases you can do much more than simply pass the data or not. You could do all manner of complex things to the data in the false case, or all manner of different things in the TRUE case. The outputs can be different data streams. You could do further nested tests. For instance you could sort the false numbers, those which are greater that 24 to return the numbers that are greater than 24 AND greater than 50 but less than 75. Wire that to the output side of the case and you now have two results. The case is "polymorphic" as well. It is not limited to TRUE and false cases. You could wire integers into the ? terminal and the cases would become case 1, 2, 3, 4 etc. Or it can be Error and No Error, and so on. However you set it up, when it gets all its input data, it looks at the conditional (?) input and finds that corresponding case and runs it. Mike Quote Link to comment
Aristos Queue Posted April 22, 2008 Report Share Posted April 22, 2008 If MAX is your maximum desired value, MIN is your minimum desired value, and RAND is a random number between 0 and 1 then: RAND * (MAX - MIN) + MIN is a random number in the desired range. Quote Link to comment
orko Posted April 22, 2008 Report Share Posted April 22, 2008 QUOTE (Aristos Queue @ Apr 21 2008, 10:00 AM) If MAX is your maximum desired value, MIN is your minimum desired value, and RAND is a random number between 0 and 1 then:RAND * (MAX - MIN) + MIN is a random number in the desired range. Which is what TobyD said above. Sometimes a formula is worth a hundred words (since a picture is worth a thousand). Quote Link to comment
Jim Kring Posted April 22, 2008 Report Share Posted April 22, 2008 QUOTE (orko @ Apr 21 2008, 11:01 AM) Which is what TobyD said above. Sometimes a formula is worth a hundred words (since a picture is worth a thousand). And, here's what that picture looks like You can download this VI as part of the OpenG Numeric Tools library. Quote Link to comment
MicrochipHo Posted April 22, 2008 Author Report Share Posted April 22, 2008 QUOTE (TobyD @ Apr 21 2008, 04:56 PM) The random number generator generates a number between 0 and 1. You need to cover a range of 6 (24-18) so multiply the random number by 6 and you have a random number between 0 and 6. Now add 18 and you're there. Thanks for all your help guys! Ok, I got the program to run. I am having trouble getting my thermometer to measure in real time. I am guessing the 1-10 loop isn't going to count for 10 seconds..... The assigment is to get the thermometer to run for 10 seconds, gathering a data point for every .25 seconds. I have a feeling that I put the time delay in the wrong place....and I am going to have to rearrage the whole thing.... After the array is written,it has to be output on a chart and written into a spreadsheet . After pressing stop, the dialog box will appear, and ask the user to name the spreadsheet, and the file should appear....let me know what you think Quote Link to comment
Jim Kring Posted April 22, 2008 Report Share Posted April 22, 2008 It's worth mentioning, here, that if you want an even distribution of integers, then the formula looks like this: INT( RAND * ( ( MAX + 0.5 ) - ( MIN - 0.5 ) ) + ( MIN - 0.5 ) ) Otherwise, your MIN and MAX values will have half the rate of occurence (probability) of the values between them. FYI, we're planning on adding support for integers in a future release of the OpenG VI. Quote Link to comment
orko Posted April 22, 2008 Report Share Posted April 22, 2008 QUOTE (MicrochipHo @ Apr 21 2008, 11:17 AM) The assigment is to get the thermometer to run for 10 seconds, gathering a data point for every .25 seconds. HINT: If the loop is operating at a 0.25 second rate, then how many iterations will it take until you reach 10 seconds? Quote Link to comment
MicrochipHo Posted April 22, 2008 Author Report Share Posted April 22, 2008 QUOTE (Jim Kring @ Apr 21 2008, 07:26 PM) It's worth mentioning, here, that if you want an even distribution of integers, then the formula looks like this:INT( RAND * ( ( MAX + 0.5 ) - ( MIN - 0.5 ) ) + ( MIN - 0.5 ) ) Otherwise, your MIN and MAX values will have half the rate of occurence (probability) of the values between them. FYI, we're planning on adding support for integers in a future release of the OpenG VI. Thanks for the formula, I will keep that in the back of my mind until further use. the question remains is how to get it in real time, plot for 10 seconds every .25 seconds. and then to write it to a file. If anyone has any input by 3PM today, that'd be cool. I will keep on trying to figure crap out until then. See Vi in my latest post above. Quote Link to comment
mross Posted April 22, 2008 Report Share Posted April 22, 2008 QUOTE (MicrochipHo @ Apr 21 2008, 11:40 AM) Ok, Part of the assignment is to generate a number between 18 and 24, and then i want to return that number to a sub VI. What a I did is multiply the randome # generator by a 100, and then put a conditional if the number is greater than 18 and less than 24....can't return the actual value, because than the output is a boolean. There are examples of how to do this whole program on the internet, but I want to work with my own code. How do I get this to return the values in float precision? I know I sound lame but I am terrible at programming...but i am trying =( MicrochipHo, Obviously, there are a variety of ways to do this. There are indeed canned functions that perform the function you want and there is nothing wrong with knowing them. There is still something to be learned from doing it the hard way. You can learn a lot more about LabVIEW the hard way, IMO. In a beginning programming class you will often encounter assignments where thay ask you to perform operations for which there are canned routines that save you from actually learning much about basic programming skills and functions. Really, that is the only reason to waste a lot of effort on the following method, but it has its place. In the attached BD you have a loop that runs 10 times. The random number is created between 0 and 1 which is scaled per your method so that the results can be sorted down to the range you want. Then through the use of inequalities and the logical AND you produce the test result of whether the number is in the range you like or not. You get to see how a shift register stores the results of prior cycles of the loop, and how that must be initialized so it starts empty every time you run the loop. You get to see how the case structrue takes the test result and either builds the "in range" values to the shift register, or sends the shift register on to the next cycle unchanged. And you get to see a visual comparison of the raw data and the processed data to make sure the results are as they should be - a good debugging technique. If you turn on the Highlighting (lightbulb icon) when you run this you can get an easy to follow beginning lesson in how dataflow. programming works. http://lavag.org/old_files/monthly_04_2008/post-48-1208803913.jpg' target="_blank"> Quote Link to comment
orko Posted April 22, 2008 Report Share Posted April 22, 2008 mross, Correct me if I'm wrong, but isn't there a possibility that none of the 10 iterations will produce a number in the desired range? I would think a while loop (vs. For Loop) that tests the size of the output array to ensure a set number of results would be nice. I see what you are getting at, and this is a good learning exercise for someone learning LabVIEW. For real world applications I think you'd agree that a one-shot algorithm approach that gaurantees one number within range on each execution (rand*(MAX-MIN) + MIN) would be a better approach. Quote Link to comment
mross Posted April 22, 2008 Report Share Posted April 22, 2008 QUOTE (orko @ Apr 21 2008, 03:04 PM) mross,Correct me if I'm wrong, but isn't there a possibility that none of the 10 iterations will produce a number in the desired range? I would think a while loop (vs. For Loop) that tests the size of the output array to ensure a set number of results would be nice. I see what you are getting at, and this is a good learning exercise for someone learning LabVIEW. For real world applications I think you'd agree that a one-shot algorithm approach that gaurantees one number within range on each execution (rand*(MAX-MIN) + MIN) would be a better approach. Exactly right. And if you run this one you can watch it happening (hence the extra indicator). Also,very instructive to the new programmer. Quote Link to comment
TobyD Posted April 22, 2008 Report Share Posted April 22, 2008 QUOTE (MicrochipHo @ Apr 21 2008, 11:17 AM) I am guessing the 1-10 loop isn't going to count for 10 seconds..... You are guessing correct. The number wired to the "N" terminal of a "for loop" sets how many times the loop will run, and not for how long. Take a look at Orko's hint above and calculate the number of times the loop needs to run. Another important thing to be aware of is this: A loop will not output its data until it has finished running and a loop will not begin to run until all of its inputs are satisfied (have data on the wire). In the VI you posted, your for loop will run 10 times and then send the data out. Once the While loop gets that data on its input it will begin to run. You should also read about auto indexing. Currently you are only passing one value from your for loop into your while loop. All of the other random numbers that you generated are lost. I have added a screenshot of your code for reference. http://lavag.org/old_files/monthly_04_2008/post-8758-1208806140.png' target="_blank"> Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.