我正处于IT的第一年和第二学期:程序员分析师,我在使用我的代码时遇到了一些问题,想出了一个彩票应用程序。
我所要做的就是在1-49之间随机输出3行7个数字,然后输出6个数字作为“标签”,我对“标签”部分没有任何问题因为有标签你不需要按顺序排列数字,你可以有0,你也可以有重复的数字。
但是乐透最大部分各有3行7个数字,它们需要从左到右依次排序,完全随机,也没有0。
到目前为止,这是我的代码,虽然我认为它是随机的而没有0,但它的工作原理却没有对数字进行排序。
代码:
//Lotto.cpp
#include <iostream> // input out put stream
#include <time.h> //randomizer
using namespace std; //prevents redundancy
void main() //main returns nothing
{
srand((unsigned int)time(0)); //random uses time for this function
while(true) // while its true; repeats upon enter key
{
//randomizes any 7 numbers between 1 and 50 and outputs all seven in three separate rows
cout << "\n **********Zachattack's Lotto Experience**********" << "\n Good Luck!!!" << endl;
cout << "\n " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1;
cout << "\n " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1;
cout << "\n " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << " " << (rand() % 49) + 1 << endl;
//randomizes 6 different numbers between 0 and 9 for the Tag
cout << "\n ***In the Bag Tag!*** \n\n " << rand() % 10 << rand() % 10 << rand() % 10 << rand() % 10 << rand() % 10 << rand() % 10 << endl;
system("pause>nul");
}
}
答案 0 :(得分:0)
在1到49之间创建21个随机数:
int randomNumbers[21];
for(int i = 0; i < 21; i++)
randomNumbers[i] = rand() % 49 + 1;
然后你订购数字:
Quicksort(randomNumbers, 0, 20);
最后你按照自己想要的方式打印它们。
您可以在wikipedia找到quicksort c ++代码。无论如何,这是:
int colocar(int *v, int b, int t)
{
int i;
int pivote, valor_pivote;
int temp;
pivote = b;
valor_pivote = v[pivote];
for (i=b+1; i<=t; i++){
if (v[i] < valor_pivote){
pivote++;
temp=v[i];
v[i]=v[pivote];
v[pivote]=temp;
}
}
temp=v[b];
v[b]=v[pivote];
v[pivote]=temp;
return pivote;
}
void Quicksort(int* v, int b, int t)
{
int pivote;
if(b < t){
pivote=colocar(v, b, t);
Quicksort(v, b, pivote-1);
Quicksort(v, pivote+1, t);
}
}
答案 1 :(得分:0)
就像乐透机一样。将1-49中的所有数字加载到列表/数组中。使用rand()创建索引0-48,从该索引处的列表中获取数字,并将其替换为“0”以标记它已被绘制。重复,(忽略任何'0'被检索),直到绘制了21个数字。排序
答案 2 :(得分:0)
当其他人打败我时,我会补充一点,使用已经提供的算法通常比从头开始执行更好。此外,如果要对它们进行排序,则必须将随机数存储在某处。在这种情况下,我使用了已经提供的向量类。另外我相信C ++你应该使用标题ctime而不是time.h,即使它们与我相信的东西是相同的。
#include <iostream>
#include <ctime>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
//set up the lottery parameters
const int GROUPS = 3;
const int NUMBERS_PER_TICKET = 7;
//seed the random generator
srand((unsigned int)time(0));
//declare the datastructure for holding the numbers
std::vector<int> numbers[GROUPS];
/* fill our three 7 number groups
by generating them */
for (int j = 0; j < GROUPS; ++j) {
for (int i = 0; i < NUMBERS_PER_TICKET; ++i) {
numbers[j].push_back((rand() % 49) + 1);
}
}
//now sort them using the built-in sort algorithm
for (int i = 0; i < GROUPS; ++i) {
std::sort(numbers[i].begin(), numbers[i].end());
}
//now print in order by line
for (int j = 0; j < GROUPS; ++j) {
std::cout<<"Line: " << j + 1 << " :";
for (int i = 0; i < NUMBERS_PER_TICKET; i++) {
std::cout<< " " << numbers[j].at(i);
}
std::cout<<std::endl;
}
}
答案 3 :(得分:0)
你可以这样做:
继续重复步骤4.以获得所需的行数(最多7行;-))。这是一个实现此策略的代码示例。不检查是否需要重复。
#include <algorithm>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
// This function is courtesy of http://benpfaff.org/writings/clc/shuffle.html
void shuffle(int *array, size_t n)
{
if (n > 1) {
size_t i;
for (i = 0; i < n - 1; i++) {
size_t j = i + rand() / (RAND_MAX / (n - i) + 1);
int t = array[j];
array[j] = array[i];
array[i] = t;
}
}
}
int main()
{
srand( time( NULL ) );
std::vector<int> numbers( 49 );
for ( int i = 0; i < numbers.size(); ++i )
numbers[i] = i + 1;
shuffle( &numbers[0], numbers.size() );
std::vector<int>::iterator rowIt = numbers.begin();
for ( int i = 0; i < 3; ++i ) {
std::vector<int>::iterator rowEnd = rowIt + 7;
std::sort( rowIt, rowEnd );
std::cout << "Row " << i << ":";
while ( rowIt != rowEnd )
std::cout << " " << *rowIt++;
std::cout << std::endl;
}
}
答案 4 :(得分:-1)
好的,首先看看循环,主要是 for 循环。它应该用于生成随机数。例如,要使用1到49之间的6个随机数填充数组,您可以使用:
int i, numbers[6];
for ( i = 0; i < 6; i++ ) {
numbers[ i ] = 1 + rand()%49
}
在你的问题中,你说数字必须是完全随机的,但我觉得你暗示数字在数组中必须是唯一的。如果是这种情况,您应该在再次添加之前检查数组中是否已存在每个数字。您可以使用set结构执行此操作,但为简单起见,您可以使用以下内容:
int i, j, num, duplicates, numbers[6];
for ( i = 0; i < 6; i++ ) {
do {
num = 1 + rand()%49;
duplicates = 0;
for ( j = 0; j < i; j++ ) {
if ( numbers[ j ] == num ) duplicates = 1;
}
} while (duplicates);
numbers[ i ] = num;
}
在数组中有数字后,您可以对它们进行排序。你可以使用qsort:
http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/
这应该足以让你入门。 祝你好运:)