I have a program that I'm developing for a class. I have to generate
10,000 random 3 digit numbers and keep track of how often each one
comes up. Once complete the program should display 10 most common and
the 10 least common numbers. The problem I'm facing is that when I run
the program it seems to just run for a long time and than after a few
minutes throws an out of index error at line 50 which reads as such
lotteryNumbers[i, 1]++;. I have included my code below. Anyone have any
ideas of what I'm doing wrong with the array and how I might speed up
the application.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace William_Cappoli_IT466_Unit_3_Project
{
public partial class frmMain : Form
{
// Array to hold numbers 000 - 999 and count occurance
int[,] lotteryNumbers = new int[1000, 2];
// Array to hold 10 most frequent numbers
int[,] maxNumbers = new int[10, 2];
// Array to hold l0 least frequent numbers
int[,] minNumbers = new int[10, 2];
// stores most recently generated number
int currentNum;
// random number generator
Random randomNumbers = new Random();
public frmMain()
{
InitializeComponent();
fillLotteryArray();
}
private void btnGenerate_Click(object sender, EventArgs e)
{
fillMinNumbersArray();
// clears out labels displaying minimum and maximum number lists
lblDisplayMostCommon.Text = "";
lblDisplayLeastCommon.Text = "";
for (int i = 0; i < 10000; ++i)
{
currentNum = randomNumbers.Next(999);
for (int j = 0; j < 1000; ++j)
{
if (lotteryNumbers[j, 0] == currentNum)
{
lotteryNumbers[i, 1]++;
}
}
maxNumber();
minNumber();
}
} // btnGenerate_Click method
private void fillLotteryArray() //Fill lottery number array with values 000 - 999
{
for (int i = 0; i < 1000; ++i)
{
lotteryNumbers[i, 0] = i;
}
} // end fillLotteryArray()
private void fillMinNumbersArray() //Fill minimum numbers array with value 5000
{
for (int i = 0; i < 10; ++i)
{
minNumbers[i, 1] = 5000;
}
} // fillMinNumbersArray()
public void maxNumber() // Find 10 most frequent numbers
{
for (int j = 0; j < 1000; ++j) // Loop for all 1000 lottery numbers
{
for (int i = 0; i < 10; ++i) // Loop for the 10 maximum numbers
{
if (lotteryNumbers[j, 1] > maxNumbers[i, 1]) // Check if there is a
more fequent number than the one stored at each index
{
for (int h = 9; h > i; --h) // Starting with index 9, store previous
index value until you reach the index that will store the new value
{
maxNumbers[h, 1] = maxNumbers[h - 1, 1];
maxNumbers[h, 0] = maxNumbers[h - 1, 0];
}
maxNumbers[i, 1] = lotteryNumbers[j, 1]; // Store new values at slated index
maxNumbers[i, 0] = lotteryNumbers[j, 0];
i = 10;
}
}
}
for (int i = 0; i < 10; ++i) // Display each number and its frequency
{
lblDisplayMostCommon.Text += maxNumbers[i, 0].ToString("000") + " "
+ Convert.ToString(maxNumbers[i, 1]) + "\n";
}
} // end maxNumber method
public void minNumber() // Find 10 least frequent numbers
{
for (int j = 0; j < 1000; ++j) // Loop for all 1000 lottery numbers
{
for (int i = 0; i < 10; ++i) // Loop for the 10 minimum numbers
{
if (lotteryNumbers[j, 1] > 0 & lotteryNumbers[j, 1] <
minNumbers[i, 1]) // Check if there is a less frequent number than the
one stored at each index disregarding numbers that have not been drawn
{
for (int h = 9; h > i; --h) // Starting with index 9, store previous
index value until you reach the index that will store the new value
{
minNumbers[h, 1] = minNumbers[h - 1, 1];
minNumbers[h, 0] = minNumbers[h - 1, 0];
}
minNumbers[i, 1] = lotteryNumbers[j, 1]; // Store new values at slated index
minNumbers[i, 0] = lotteryNumbers[j, 0];
i = 10;
}
}
}
for (int i = 0; i < 10; ++i) // Display each number and its frequency
{
lblDisplayLeastCommon.Text += minNumbers[i, 0].ToString("000") + "
" + Convert.ToString(minNumbers[i, 1]) + "\n";
}
} // end minNumbers method
} // form1 partial class
} // end namespace
Thanks for your help
Loading
Bill CappoliPosted Nov 25, 2008, 12:11 AM
AlanPosted Nov 24, 2008, 4:42 PM
You have a number of problems there, Bill.
Try it like this:
public partial class frmMain : Form
{
// Array to hold numbers 000 - 999 and count occurance
int[,] lotteryNumbers = new int[1000, 2];
// Array to hold 10 most frequent numbers
int[,] maxNumbers = new int[10, 2];
// Array to hold l0 least frequent numbers
int[,] minNumbers = new int[10, 2];
// stores most recently generated number
int currentNum;
// random number generator
Random randomNumbers = new Random();
// determines whether frequencies need to be reset
bool reset = false;
public frmMain()
{
InitializeComponent();
fillLotteryArray();
}
private void frmMain_Load(object sender, EventArgs e)
{
}
private void btnGenerate_Click(object sender, EventArgs e)
{
fillMinNumbersArray();
fillMaxNumbersArray();
if (reset) resetLotteryFrequencies();
// clears out labels displaying minimum and maximum number lists
lblDisplayMostCommon.Text = "";
lblDisplayLeastCommon.Text = "";
for (int i = 0; i < 10000; ++i)
{
currentNum = randomNumbers.Next(1000); // excludes 1000
lotteryNumbers[currentNum, 1]++;
}
maxNumber();
minNumber();
reset = true;
} // btnGenerate_Click method
private void fillLotteryArray() //Fill lottery number array with values 000 - 999
{
for (int i = 0; i < 1000; ++i)
{
lotteryNumbers[i, 0] = i; //second dimension zero by default
}
} // end fillLotteryArray()
private void resetLotteryFrequencies() //Reset frequencies to zero
{
for (int i = 0; i < 1000; ++i)
{
lotteryNumbers[i, 1] = 0;
}
} // end fillLotteryArray()
private void fillMinNumbersArray() //Fill minimum numbers array with 1000
{
for (int i = 0; i < 10; ++i)
{
minNumbers[i, 0] = 1000; // impossibly large
minNumbers[i, 1] = 10001; // ditto
}
} // fillMinNumbersArray()
private void fillMaxNumbersArray() //Fill maximum numbers array with -1
{
for (int i = 0; i < 10; ++i)
{
maxNumbers[i, 0] = -1; // impossibly small
maxNumbers[i, 1] = -1; // ditto
}
} // fillMaxNumbersArray()
public void maxNumber() // Find 10 most frequent numbers
{
// Array to determine whether number already used
bool[] usedNumbers = new bool[1000]; // all false by default
for (int i = 0; i < 10; ++i) // Loop for the 10 maximum numbers
{
for (int j = 0; j < 1000; ++j) // Loop for all 1000 lottery numbers
{
if (usedNumbers[j]) continue;
if (lotteryNumbers[j, 1] > maxNumbers[i, 1]) // Check if there is a more frequent number than the one stored at each index
{
maxNumbers[i, 0] = lotteryNumbers[j, 0]; // Store new values at slated index
maxNumbers[i, 1] = lotteryNumbers[j, 1]; // and its frequency
}
}
usedNumbers[maxNumbers[i,0]] = true;
}
for (int i = 0; i < 10; ++i) // Display each number and its frequency
{
lblDisplayMostCommon.Text += maxNumbers[i, 0].ToString("000") + " " + Convert.ToString(maxNumbers[i, 1]) + "\r\n";
}
} // end maxNumber method
public void minNumber() // Find 10 least frequent numbers
{
// Array to determine whether number already used
bool[] usedNumbers = new bool[1000]; // all false by default
for (int i = 0; i < 10; ++i) // Loop for the 10 minimum numbers
{
for (int j = 0; j < 1000; ++j) // Loop for all 1000 lottery numbers
{
if (usedNumbers[j]) continue;
if (lotteryNumbers[j, 1] < minNumbers[i, 1]) // Check if there is a less frequent number than the one stored at each index
{
minNumbers[i, 0] = lotteryNumbers[j, 0]; // Store new values at slated index
minNumbers[i, 1] = lotteryNumbers[j, 1]; // and its frequency
}
}
usedNumbers[minNumbers[i, 0]] = true;
}
for (int i = 0; i < 10; ++i) // Display each number and its frequency
{
lblDisplayLeastCommon.Text += minNumbers[i, 0].ToString("000") + " " + Convert.ToString(minNumbers[i, 1]) + "\r\n";
}
} // end minNumbers method
} // form1 partial class