|
|
I'm writing a program where i need 4 different random numbers. i'm using one Random, called "gen" and using gen.Next(1,52) so my number falls in between 0 and 53. (using 4 different Randoms only makes my problem worse below)
however, frequently, i get 2 or more of the variables to be equal, which i dont want. i know i can use if statements and switch statements, but it would be too long:
if (i == j) ...
if (i == k) ...
if (i == l) ...
if (j == i) ...
if (j == k) ...
...
and then i would have to use a loop to make sure those weren't the same...
what can i do?
|
|
|
|
|
Insert them into a set until you have four values ? Does C# have sets ? Surely it does....
Christian
I have drunk the cool-aid and found it wan and bitter. - Chris Maunder
|
|
|
|
|
i dont know enough to be sure if it has sets, much less what sets are...
got any explanations or articles?
|
|
|
|
|
Is this your homework ? You seem sufficiently beginnerish to make me suspect that.
Anyhow, a set is a collection in which no item can appear more than once. A quick search of the Collections namespace has me thinking that there is no support for sets built into C#, how utterly gay.
Christian
I have drunk the cool-aid and found it wan and bitter. - Chris Maunder
|
|
|
|
|
lol, no, im not in school right now...
im pretty new to programming... sorry about the ignorance. im making a blackjack program, and i've recently gotten in to C#. started out on java a few years back, but gave up... now im back with C#...
|
|
|
|
|
Hmmm... Ended up beeing more code than I thought...
using System.Collections;
public class RandomCollection
{
private Random rnd = new Random();
public int[] RandomSample(int count, int low, int high)
{
ArrayList rnds = new ArrayList();
for(int i = 0; i < count; i++)
{
int t = rnd.Next(low, high - i);
foreach(int r in rnds)
{
if(t >= r) t++;
}
rnds.Add(t);
}
rnds.Sort();
return (int[])rnds.ToArray(typeof(int));
}
}
[Modified:]The rnds.Sort(); statement is NOT optional as previously stated...[/]
Have a look at my latest article about Object Prevalence with Bamboo Prevalence.
|
|
|
|
|
if its not difficult, could you explain this to me line-by-line so i could integrate it into my program?
if you cant, dont worry about it...
|
|
|
|
|
1: using System.Collections;
2: public class RandomCollection
3: {
4: private Random rnd = new Random();
5: public int[] RandomSample(int count, int low, int high)
6: {
7: ArrayList rnds = new ArrayList();
8: for(int i = 0; i < count; i++)
9: {
10: int t = rnd.Next(low, high - i);
11: foreach(int r in rnds)
12: {
13: if(t >= r) t++;
14: }
15: rnds.Add(t);
16: }
17: rnds.Sort();
18: return (int[])rnds.ToArray(typeof(int));
19: }
20: }
The card deck is represented as the numbers 1 through 52.
- First you pick a card from the 52 cards available. In line 11, i is 0, so the statement executed does something like int t = rnd.Next(1, 52); . Line 13 isn't executed, since the rnds ArrayList is still is empty.
t represents the first card.
- Second you pick a card from the 51 cards left. Since i is 1, line 11 will dosomething like int t = rnd.Next(1, 51); .
If t is equal to or higher than the first card's number; Add 1. (So that t is in the range of 1 through 52, except for the first card's number.)
- Third you pick a card from the 50 cards left...
If t is equal to or higher than the first card's number; Add 1. (So that t is in the range of 1 through 51, except for the first cards number.)
If t is equal to or higher than the second card's number; Add another 1. (So that t is in the range of 1 through 52, except for the first to cards' number.)
- Fourth you pick a card from the 49 ones left in the deck...
If t is equal to or higher than the first card's number; Add 1. (So that t is in the range of 1 through 50, except for the first cards number.)
If t is equal to or higher than the second card's number; Add another 1. (So that t is in the range of 1 through 51, except for the first to cards' number.)
If t is equal to or higher than the second cards number; Add yet another 1. (So that t is in the range of 1 through 52, except for the first three cards' number.)
There you have it...
NB: The rnds.Sort(); statement in line 17 is NOT optional as previously stated...
Have a look at my latest article about Object Prevalence with Bamboo Prevalence.
|
|
|
|
|
thanks a lot!
what is the purpose of rnds.Sort()?
why is it not optional?
|
|
|
|
|
The algorithm will in some cases fail, if the numbers aren't sorted lowest to highest.
Example: If you allready picked 5 and 4 (in that order) and now you're picking 4 again. First check finds that 4 (latest pick) is less than 5 (first pick), so latest pick isn't increased.
The second check will compare 4 (from the latest pick) with 4 (from the second pick) and decide it should increase the latest pick. The latest pick is now 5, and card number 5 can't be picked twice.
When the numbers are sorted, the last pick will increase to 5 on the first comparison and to 6 on the second. Now no cards are beeing picked twice.
Have a look at my latest article about Object Prevalence with Bamboo Prevalence.
|
|
|
|
|
Have you tried using Rand.NextDouble() and doing the multiplication yourself?? That always got new numbers for me. For numbers 1-52 (cards im assuming) do (int)(Rand.NextDouble*52)+1. It seems to give me all different numbers.
|
|
|
|
|
is there a chance it COULD return two or more of the same?
yes, its a blackjack game, and i want to make sure that on the small chance it could happen it would...
thanks.
|
|
|
|
|
Yeah random is random. If it gets 2 or more numbers that end up multiplying out to be together then they will be the same.
|
|
|
|
|
Hello,
Can I make use of an object created in C++ in a program written in C#? If so can someone direct me to any online literature or tips on the subject?
Thanks in advance
|
|
|
|
|
Not without a managed wrapper around it. Your best bet to creating one would be Managed C++. Your C++ code can create the object and manipulate its unmanaged properties and methods and whatnot while exposing a .NET Framework managed interface that your C# code can use.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Dave's right - a managed wrapper using a mixed-mode Managed C++ assembly would be the easiest. When compiled, the assembly can be used by any other managed language.
You can, however (if you understand P/Invoke and marshaling well), use DllImportAttribute with the CallingConvention.ThisCall and some added class factory functions exported from your native DLL (to create and destroy the class). Read about CallingConvention.ThisCall in the .NET Framework SDK for more information.
Again, though, I'm not recommending this over Dave's reply. I'd definitely go that route; I'm only providing an alternative for completeness.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Heath Stewart wrote:
You can, however (if you understand P/Invoke and marshaling well), use DllImportAttribute with the CallingConvention.ThisCall and some added class factory functions exported from your native DLL (to create and destroy the class).
Heath, how about an article?
top secret xacc-ide 0.0.1
|
|
|
|
|
Sure, when my next mythical time slot opens up.
I actually have discussed this several times here in this forum and have provided a pretty in-depth example. That will have to suffice for now.
It is entirely possible, though, and I have used it in our class libraries before.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Do you have a link to the example perhaps? Or know where I might find any others? I'm interested as well...
Thanks!
|
|
|
|
|
Type "CallingConvention" in the index of your .NET Framework SDK documentation and/or click "Search comments" directly above the message board and search for "CallingConvention" or something. I have over 6,500 posts and only the last 200 are visible using the profile pages. There's no way I could track all this. That's what the search is for.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Sorry, I misunderstood, Was looking for an example of a Managed DLL wrapper, not doing the calling convention.
Search doesn't seem to be working or else nobody has mentioned dll or callingconvention in the past two years
Anyway to reinstate the question does anyone have any examples of a managed C++ dll wrapper? Just would like to see how it's being done.
Thanks!
|
|
|
|
|
|
"Wrapper" is such an ambiguous term, you really need to be specific. Any function or method you call uses a calling convention. When you use ThisCall when marshaling from managed to unmanaged code, the address of the object is pushed onto the execution stack before the first parameter (which becomes the second parameter, and so on).
You can wrap native APIs, too. I've written several MC++ assemblies when I've needed to wrap a whole bunch of APIs (otherwise I just P/Invoke them in C#).
All you do is write Managed C++ and call native APIs. If you want to know more about what makes the difference between managed and unmanaged C++, read Managed Extensions for C++ Programming[^] in the Visual Studio .NET documentation.
You can probably find examples here on CodeProject using the other search at the top of the page below Bob, the CodeProject alien.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I am pretty new to C# and im trying to access Microsoft Windows volume control. I have tried using interop (via spy++). The problem is that say if i want to mute line in, i can find the WM_COMMAND parameters and put them into my code, and it will do nothing. But i know this code works because when i put in the close window parameters it works fine. So it must be the parameters for the mute button that im not interpereting properly? If anyone knows the parameters to mute and change the volumes for different line channels, or could help in any other way it would be greatly appreciated, cheers
Oldmate
|
|
|
|