|
Well 1 million is what I need in fact ;o
Thank you for trying. It took 1 second even when you have to repopulate the list at every pass? I need to see this by myself!
|
|
|
|
|
This took 2.7s on my machine. What's your code?
List<uint> deck = new List<uint>();
uint[] cards = new uint[52];
Random rnd = new Random();
DateTime st = DateTime.Now;
for (int i = 0; i < 1000000; i++)
{
deck.Clear();
deck.AddRange(cards);
deck.RemoveAt(rnd.Next(0, deck.Count - 1));
deck.RemoveAt(rnd.Next(0, deck.Count - 1));
deck.RemoveAt(rnd.Next(0, deck.Count - 1));
deck.RemoveAt(rnd.Next(0, deck.Count - 1));
deck.RemoveAt(rnd.Next(0, deck.Count - 1));
}
DateTime ed = DateTime.Now;</uint></uint>
|
|
|
|
|
Random rnd = new Random();
List<int> myDeck = new List<int>();
DateTime start = DateTime.Now;
for (int loop = 0; loop < 1000000; ++loop)
{
myDeck.Clear();
for (int i = 0; i < 52; ++i)
{
myDeck.Add(i);
}
List<int> hand = new List<int>();
// Randomly remove a random card until the deck is empty
for( int draw = 0; draw<5; ++draw )
{
int cardIndex = rnd.Next(myDeck.Count);
int card = myDeck[cardIndex];
myDeck.RemoveAt(cardIndex);
hand.Add(card);
}
}
DateTime end = DateTime.Now;
[edit] - turned off the html tags - which kills the formatting, but at least you can see the generics!
Help me! I'm turning into a grapefruit!
Buzzwords!
|
|
|
|
|
Don't move the data around so much... Instead of shifting half the deck to remove a card, just move the last card into the empty slot.
Runs in 125 ms. on my puter:
public class Deck {
private int[] _cards;
private int _used;
private Random _rnd;
public Deck() {
_cards = new int[52];
_used = 0;
_rnd = new Random();
}
public void Init() {
for (int i = 0; i < 52; i++) {
_cards[i] = i;
}
_used = 52;
}
public void GetHand(int[] hand) {
for (int i=0;i<5;i++) {
int index = _rnd.Next(_used);
hand[i] = _cards[index];
_used--;
_cards[index] = _cards[_used];
}
}
}
Deck deck = new Deck();
int[] hand = new int[5];
for (int i = 0; i < 1000000; i++) {
deck.Init();
deck.GetHand(hand);
}
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Hi,
the strategy of putting all candidates in a collection, and extracting from there as many as you need in a random way, is correct. However, if you only want to extract a small fraction, it may be more economical to forget the collection, and just try 5 random numbers; whenever one is chosen that has been picked already, just throw the dice again. For 5 out of 52 that will occur in some 10% of the cases.
If on the other hand, you decide to stick with the collection, there is no real need to build it over and over; once done, you can add the chosen items back to the collection. That would change the order, but then you could sort the collection (not sure that would be faster than recreating it), or you could ignore the issue, just relying on the randomness of the picking process. Strict randomness would mean the outcome does not depend on the previous outcome, so all candidates have the same probability, no matter where they are in the collection.
Of course, if you are creating the perfect poker playing app, and are gambling your fortune, you may want to make sure, and follow the official ways...
Luc Pattyn [Forum Guidelines] [My Articles]
I use ListBoxes for line-oriented text (not TextBoxes), and PictureBoxes for pictures (not drawings).
modified on Friday, June 10, 2011 12:23 PM
|
|
|
|
|
Luc Pattyn wrote: If on the other hand, you decide to stick with the collection, there is no real need to build it over and over; once done, you can add the chosen items back to the collection.
Interresting idea. It shaved off about 25% of the executon time of the code I posted earlier. What I did was actually to leave the chosen items in the array, only swapping them to the unused area at the end.
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Yes I did that too, and it ran pretty fast. (400ms on my old comp)
It's probably the best method. The List approach is really too slow for what I need (Monte Carlo simulations).
Thanks everyone for your time.
|
|
|
|
|
Hi Guffa,
I didn't see your code until now; if you have an array, rather than a vague collection, swapping cards out of sight as you did is the right way to go IMO. Reinserting the chosen ones would mean: undo the swaps (which you should do in reverse order of course). The advantage now is you are restoring
the exact state the array had to begin with without touching things that hadn't changed in the process.
Luc Pattyn [Forum Guidelines] [My Articles]
I use ListBoxes for line-oriented text (not TextBoxes), and PictureBoxes for pictures (not drawings).
modified on Friday, June 10, 2011 12:23 PM
|
|
|
|
|
Actually, I just left the deck in the new order and included all cards again. As you wrote before, the order of the cards in the deck doesn't matter when you draw cards by random.
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Yes I know, however not everyone tends to believe that. They start arguing it might be true for real random stuff, but then it is only pseudo-random and ...
WTF.
Luc Pattyn [Forum Guidelines] [My Articles]
I use ListBoxes for line-oriented text output (not TextBoxes), and PictureBoxes for pictures (not drawings).
modified on Friday, June 10, 2011 12:24 PM
|
|
|
|
|
|
Great. I especially like "Random() returns increasingly randomer numbers the more you call it".
Luc Pattyn [Forum Guidelines] [My Articles]
I use ListBoxes for line-oriented text output (not TextBoxes), and PictureBoxes for pictures (not drawings).
modified on Friday, June 10, 2011 12:24 PM
|
|
|
|
|
It's a bit late to be posting on this thread, but I've been busy.
I wrote a Cribbage card game, some years ago and the way that I did it was to implement a deck class which had a shuffle method, which simply filled a list with random cards (numbers 0-51), drawing again if already used. Dealing then simply became a matter of taking the 'next' card, tracked by an 'index' field. This had many advantages during testing since the deck was still there in the original order. Dont know if this is a good idea, or even relevant to your simulation idea.
Henry Minute
If you open a can of worms, any viable solution *MUST* involve a larger can.
|
|
|
|
|
Thank you for your input.
Nope in my case this won't work, as you have to rebuild the deck. Creating a list is really the most straightforward way, but when you have to do this 1 million times+, it's too slow.
|
|
|
|
|
I wish for my c# program to search, through a list of Addresses, for particular Address. The user will enter a couple of letters in a textbox and then the program will go out and search a Sql database for that Address.Can some on give me some ideas on how to do this or maybe some samples ?
Thanks in advance..
|
|
|
|
|
Hi,
sql supports wildcard search by using the word 'like'. Have a look at http://www.sql-tutorial.net/SQL-LIKE.asp[^].
All you have to do is build a GUI (ASP.NET or Windows Forms) and connect your database with the GUI.
Regards
Sebastian
|
|
|
|
|
You asked this before almost a week ago, you recieved all the help to get this done. Which part are you stuck on now? You *know* the SQL wildcard char is %, you said you understood that. Where is the problem??
If in postal code textbox (we will call it txtPostalCode) they enter 92 then you do
SQL= "select * from db.table where postal_code like %" & ToInt32(txtPostalCode.Text) & "%";
That will catch all results with *92*; it would catch 92010 or 08920 etc
Should be sufficient to complete your project.
ToInt32 will catch common exceptions....
modified on Thursday, January 15, 2009 8:58 AM
|
|
|
|
|
Is the a specific reason you 1 voted me for helping you *again*...
prick.
modified on Thursday, January 15, 2009 9:20 AM
|
|
|
|
|
Balanced
DaveBTW, in software, hope and pray is not a viable strategy. (Luc Pattyn)Visual Basic is not used by normal people so we're not covering it here. (Uncyclopedia)
|
|
|
|
|
It's extremely upsetting. He posted the same question here,[^] received the same help he is going to get here. In fact I took it one step further and mapped out his SQL statement (without fear of SQL injection, clearly it is a homework project) and he has the balls to be so ungrateful. Sometimes it's discouraging, you know?
Edit: Thanks, it's not so much I care about it, just the fact that it's done for no reason, when he actually * received* help.
|
|
|
|
|
Yeah - that's why I balanced his vote.
Just rise above it! There are far too many of these types on the interweb to let them get to you. Just take pleasure in helping those that deserve and appreciate your assistance.
DaveBTW, in software, hope and pray is not a viable strategy. (Luc Pattyn)Visual Basic is not used by normal people so we're not covering it here. (Uncyclopedia)
|
|
|
|
|
Why did you reply to yourself? He won't receive the message, and I doubt he's a regular on the boards. The ungrateful little oik will have had an email with your answer, and that'll be it until he needs help finding his backside again.
|
|
|
|
|
Hi All,
I have COM component which is referred in my C# application. Visual studio has generated interop for the COM and able to call the methods from C# code.
This component has a method with parameters being optional. Now I am not able to force the compiler to use default values of these optional parameter instead of explicitly passing them. In other words I don’t want to pass any values to call this method. I tried using System.Reflection.Missing.Value. but it throw error saying type missmatch. Method is looking for integer type value.
Is there any I can call this method without passing any parameters and creating a wraper to this assembly.
Thank you,
Krishnaraj Barvathaya B
|
|
|
|
|
Optional parameters don't exist in C# unfortunately. The best you can do is create an overload and have the overload call the full method.
I hate to say it, but you can do this in VB! There was talk of it being introduced into C#4 but I don't know if it's made it or not.
void Method(int a)
{
Method(a, 0);
}
void Method(int a, int b)
{
}
DaveBTW, in software, hope and pray is not a viable strategy. (Luc Pattyn)Visual Basic is not used by normal people so we're not covering it here. (Uncyclopedia)
|
|
|
|
|
I'm pretty sure optional parameters made it in. There's an inititive to introduce new features to both C# and VB.NET at the same time. This also means syncronizing the existing feature sets between the two languages where appropriate. For example, C# gets the optional parameters VB.NET supports, but VB.NET does NOT get the unsafe code and pointer support that C# has. At least, not yet...
|
|
|
|