|
Your right, I should have specified that the largest difference between the upper and lower bounds could not exceed a 16-bit value and that the generated number is limited to 16 bits as well.
I supposed it depends on what he was using it for, personally I’ve never needed to use the functions for anything other that bogus test data for my app’s.
Have a good one,
-Ben
---------
On the topic of code with no error handling -- It's not poor coding, it's "optimistic"
|
|
|
|
|
The problem with & isn't limited to low/high ranges greater than 16 bits. lower==0, upper==0x10 will also give you trouble when used with bitwise and operator. The generator will be returning 0 or 16.
Tomasz Sowinski -- http://www.shooltz.com.pl
|
|
|
|
|
I have written this function and it gives me a random number between [nMin..nMax]
int RandBetween(int nMin, int nMax)
{
int r = (rand() * RAND_MAX + nMin) % nMax;
if (r <= nMin)
r = nMin+1;
else
if (r >= nMax)
r= nMax-1;
return r;
}
Mh2!
|
|
|
|
|
Shouldn't the nMin be outside the parenthesis?
|
|
|
|
|
Ok, here's my try
I decided to go the mundane inelegant math route (though I bet there are elegant ways to do this). This code computes a number in the range nLower to nUpper, and adds it to nLower. One major stumble is that you need to be able to store the range, so an int wont cut it.
Also, this code has a problem, in that it returns numbers from nLower to nUpper-1. You can extend the range by 1 in most cases, but you run into snarky special case code. I'll leave it like this - season to taste.
int GetRandomNumberBetween(int nLower, int nUpper){
int nTheRandomNumber = 0;
unsigned int range, offset;
float r;
assert( nUpper >= nLower );
range = (nUpper - nLower);
r = (float)rand() / (float)RAND_MAX;
offset = (int)(r * range);
nTheRandomNumber = nLower + offset;
TRACE(_T("nTheRandomNumber = %d\n"), nTheRandomNumber);
return nTheRandomNumber;
}
|
|
|
|
|
I've gotten caught up in this - I think the code I posted above comes close, but I have the feeling that the distribution of values will be less than optimal for very large ranges.
Here's something that might be of interest - I dug this out of my trusty ol 'Programming the Pet/CBM' by Raeto Collin West (best book I ever bought) - its a Gaussian formula for generating pseudo random numbers, of the form x = a * x + c (mod m) - (should be subscripts on the x's - but you get the idea - x is plugged back into the formula to get the next x).
According to Gauss, the maximum period is obtained when a = 4*n + 1 and c is an odd number. I don't know this stuff well enough to tell you whether there is a particular a and c that should be used.
This little fn seems to give good results:
unsigned int GetRandInt32() {
static unsigned x = 0;
unsigned n = 5;
x = (((4*n+1) * x) + 1231) % INT_MAX;
return x;
}
You can play with the values I have hardcoded (shame on me). There's probably better stuff on the web somewhere.
Anyway, the point here is that if you can roll your own rand that gives you values from 0 to INT_MAX you'll probably get a better distribution over the range -INT_MAX to INT_MAX than you will with the current rand(), whose RAND_MAX is 32767 - there's gotta be a loss of precision somewhere there.
There may be other considerations - some rands are prone to repeating subseries, some have quirks in that numbers generated alternate between even and odd. Also, there is the concept of a seed - how do we get a fundamentally different sequence out of this?
I also wonder if its a hard problem to predict the period given the inputs - I think it might be - though Gauss could probably assure inputs that give the maximum period - I think 257*x + 43981 (mod 65536) recurs after 65536 iterations.
Ok - now somebody's going to tell me about a good 5000 page academic text I should go read... sigh... anyway, just thought you might be interested...
|
|
|
|
|
well, I have made this small macro a long time ago:
#define GetRandom(min, max) ((rand() % (int)(((max) + 1) - (min))) + (min))
You have to call srand() first, if you want to initialize the random generator, something like srand(GetTickCount());
- Anders
Money talks, but all mine ever says is "Goodbye!"
|
|
|
|
|
Anders
Nice one - but still has problems for very large ranges - maybe I'm going overboard here, but you'll see that it has problems with something like
TRACE(_T("GetRandom returns %ld\n"),GetRandom(-INT_MAX, INT_MAX));
Not sure if that's the point of this thread, but can you see a way to handle that inline in your macro?
|
|
|
|
|
Yea, but it works just fine for just about 99% of what people need (I guess)
How often do you want a random number larger than a 32 bit int?
- Anders
Money talks, but all mine ever says is "Goodbye!"
|
|
|
|
|
take a look at http://www.math.keio.ac.jp/matumoto/cokus.c for a set of C functions that generate a 32 bit random number.
To get a number between nLower and nUpper
UINT number = randomMT();
number /= (UINT_MAX / (nUpper - nLower));
number += nLower;
---
Multitasking: Screwing up several things at once.
|
|
|
|
|
From what I understand:
You use Structured Exception Handling when using the Win32 API without MFC.
You use MFC Exceptions (obviously) when using MFC.
When do you mix them? When do you not? Any anecdotal experiences that you wouldn't find in the manual? (MSDN just relaunched their site and it's impossible to get to any of the pages today... how evil) Thanks in advance
--
Peace,
Amit Jain
|
|
|
|
|
I think you left one out - C++ exception handling, though it does get a bit confusing since MS does make use of SEH in implementing their C++ exception handling.
Jeffrey Richters 'Advenced Windows' has a whole chapter on SEH. I would say that if you are using the C language with the windows API SEH is the way to go, and in the rare case that you need to trap and _identify_ floating point and processor traps, but otherwise stick to C++.
If you are dealing with MFC classes that throw MFC exceptions its a no brainer - but you don't have to derive from CException for your own stuff, thats up to you.
|
|
|
|
|
|
Why I need the UDP ?
i want to create something (Like OCX or DLL) to let the server send a message to the client(s) inform them to refresh ,redirect ,there is new email, XXX is logged on.
how i'm thinking to solve this problem?
create client OCX (without using the WinSock.OCX) to wait and manage the server message. and create an DLL on the server that will send the message to the Client OCX. (i think this is a good solution ?! do you think that ????!! )
What i want ?
i do not know how to write a code deal with UDP ?!
if you have another idea ?? i'll be pleased to you if you send it to me
Note : I’m talking about intranet.
Can any one there help me ? or give and any article(s) that could help ?!
web programmer.
|
|
|
|
|
Create a SOCK_DGRAM type socket, and use sendto() and recvfrom() to send and receive UDP datagrams.
|
|
|
|
|
thank you very mach "markkuk" .
web programmer
|
|
|
|
|
The app my company sells allows the user to print JPG files. Under Windows NT 4.0 (service pack level doesn't seem to matter), the printjob spools up but once in the spooler, it just goes away without being printed. I *think* this is the only printer it happens on, and the same app/printer combo works fine under Win95/98.
Has anyone else had similar problems with the NT/950C combo while printing graphics?
I think it's a driver problem, but HP has told our hardware tech that it's the program we're using that is at fault.
I stepped through the code, but nothing seems to be out of place or weird about it.
BTW, StrechBlt is used to "display" the output to the printer. I tried using BitBlt instead, but that didn't help the problem. Removing the call to StrechBlt altogether allows the printer to at least eject a blank page.
|
|
|
|
|
I have a string in VB and a string in VC++. I need to check and make sure they are the same. I believe if I show their hex representation or their bit representation I can compare them.
|
|
|
|
|
They almost certainly are not identical. VB uses "BSTR"s, which store a lenght value and then an array of character data, while C/C++ generally use null terminated character arrays as strings. It's a pain in the rear to go back and forth, but not hard once you grock the two concepts.
For a good overview of different flavors of strings, see the string article at:
http://www.pgh.net/~newcomer/mvp_tips.htm
Jim
|
|
|
|
|
Thanks, thats a good site, it helps. I am still looking for a way to display these strings in bit or hex form.
|
|
|
|
|
We just had this discussion over at microsoft.public.vc.mfc
Here is one example from that discussion:
<br />
CString strBytes("ff10ab");<br />
char buffer[2];
buffer[0] = 0;
int digit;<br />
for(int i=0;i<strBytes.GetLength();i++)<br />
{ <br />
buffer[0] = strBytes[i];<br />
digit = strtol( buffer, 0, 16 );
TRACE("Digit %i is %d in decimal, %x in hex\n",i,digit,digit);<br />
}<br />
|
|
|
|
|
|
Of it should it should. I knew that, I just wanted to make sure that you knew it also!
Jim
|
|
|
|
|
Fist iam a newbie with MFC!
But i was asked to make an program that reads from the Comport, that is connected whit a windmachine.The windmachine sends me diffrent sort of kordinates(16 diffrent cords).
My problem here is that the user wants to choose how many kords he wants to display,my idea was to create a new ChildFrame for each kord that is selected to show.And store the ChildFrames in a array and if there comes new kords from the Comport use the ChildeFrame array to send right kords to the right ChildFrame.
The ChildFrame has a ChildView(CWnd derived) wich recives the kords for painting(OnPaint()).
I used the appwizzard (MDI,No doc/view)
I wounder if i am on the right track?
If u have a better soulotion for doing this a better way post a message here !
(Sorry my bad english)
|
|
|
|
|
when ever i run a program in debug mode, after i exit the program, i always get a message "Detected Memory Leak".. what do i do about it??? can you tell me where i am missing or making an error??
Nitish
|
|
|
|