首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ Srand值问题

C++ Srand值问题
EN

Stack Overflow用户
提问于 2014-11-02 00:52:57
回答 2查看 68关注 0票数 0

所以我创建了一个随机值的彩票,然后对它进行排序。我不担心排序技术,因为老师没有在这份作业中寻找课程等等,而且它有效,然而,我产生的票值-尽管使用srand (时间(0)),然后是兰德()% 40 +1-我认为应该使我的随机之间1-40.但是mainTicket总是等于0。有什么想法吗?很抱歉格式化,让我增加了额外的空间和搞乱了我的缩进。

代码语言:javascript
复制
#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;

void mainLotto (int main[]);
void lottoSort (int ticketArr[]);

int main()
{
int mainTicket[5];

srand (time(0));

mainLotto(mainTicket);

do
{
    lottoSort(mainTicket);
} while (mainTicket[0] > mainTicket[1] || mainTicket[1] > mainTicket[2] || mainTicket[2] > mainTicket[3] || mainTicket[3] > mainTicket[4] || mainTicket[4] > mainTicket[5]);

for (int i = 0; i < 5; i++)
{
    cout << mainTicket[i] << "\n\n";
}

return 0;
}

///
/// <> Creates the actual lottery ticket
///
void mainLotto (int main[])
{
// Creating the ticket
for (int i = 0; i < 5; i++)
{
    main[i] = rand() % 40 + 1;
}
}

///
/// <> Sorts the actual lottery ticket
///
void lottoSort (int ticketArr[])
{
 // Sorting the ticket
for (int j = 0; j < 5; j++)
{
    if (ticketArr[j] > ticketArr[j+1])
    {
        int temp;

        temp = ticketArr[j+1];

        ticketArr[j+1] = ticketArr[j];

        ticketArr[j] = temp;
    }
}
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-02 01:04:02

我看到在超出范围访问数组时出现了两个问题:

这里:

代码语言:javascript
复制
int main()
{
    int mainTicket[5];

    srand(time(0));

    mainLotto(mainTicket);

    do
    {
        lottoSort(mainTicket);
    }
    while(mainTicket[0] > mainTicket[1] || mainTicket[1] > mainTicket[2]
        || mainTicket[2] > mainTicket[3] || mainTicket[3] > mainTicket[4]);
//      || mainTicket[4] > mainTicket[5]); // OUT OF BOUNDS!!!

    for(int i = 0; i < 5; i++)
    {
        cout << mainTicket[i] << "\n\n";
    }

    return 0;
}

和这里:

代码语言:javascript
复制
void lottoSort(int ticketArr[])
{
    // Sorting the ticket
    for(int j = 0; j < 4; j++) // j < 4 NOT 5!!! <== WAS OUT OF BOUNDS
    {
        if(ticketArr[j] > ticketArr[j + 1])
        {
            int temp;

            temp = ticketArr[j + 1];

            ticketArr[j + 1] = ticketArr[j];

            ticketArr[j] = temp;
        }
    }
}

排序例程很可能是从数组边界的外侧拖入零的。

票数 2
EN

Stack Overflow用户

发布于 2014-11-02 00:59:34

我刚刚打印了一个项目,你声称总是零,在mainLotto()之后,它产生了30。

我怀疑问题就在你告诉我们不要看的地方。:)

在排序函数中,您可以:

代码语言:javascript
复制
for (int j = 0; j < 5; j++) {
    if (ticketArr[j] > ticketArr[j + 1]) {

数组大小为5,您的j最终将取一个等于4的值。

然后是ticketArr[j + 1],它实际上是一个超出绑定访问范围的

修复方法是一直到循环中的4,而不是5。

正如Galik所说的,mainTicket[4] > mainTicket[5]也是一种不受限制的访问,在阅读了我的答案之后,您应该能够理解为什么。:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26694907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档