首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >srand in C-只有一次重复

srand in C-只有一次重复
EN

Stack Overflow用户
提问于 2015-06-22 07:44:27
回答 1查看 129关注 0票数 1

我正在尝试构建一个记忆游戏,我想问一下如何通过一次重复来生成随机数。比如1-1,2-2,3-3。我将在这里粘贴我创建的函数,并告诉我是否必须创建另一个函数,以便创建一个条件,仅从数字创建一对。

代码语言:javascript
复制
// function to fulfill the table
void preencher_mesa(int matriz[4][4], int dificuldade)
{
    int i, j;
    int lim_col, lim_linha; // limits of the matriz

    for(i=0; i<4; i++)
        for(j=0; j<4; j++)
            matriz[i][j] = 0;

    if(dificuldade == 1)
    {
        lim_col = 3;
        lim_linha = 2;
    }
    else if(dificuldade == 2)
    {
        lim_col = 4;
        lim_linha = 2;
    }
    else if(dificuldade == 3)
    {
        lim_col = 4;
        lim_linha = 4;
    }

    srand(time(NULL));
    for(i=0;i<lim_linha;i++)
    {
        for(j=0; j<lim_col;j++)
        {
            if(dificuldade == 1) // difficulty == 1
            {
                matriz[i][j] = (rand()%3)+1;
            }
            else if(dificuldade == 2) // difficulty == 2
            {
                matriz[i][j] = (rand()%6)+1;
            }
            else if (dificuldade == 3) // difficulty == 3
            {
                matriz[i][j] = (rand()%8)+1;
            }
        }
    }

    mostrar_mesa(matriz); //showtable
}
EN

回答 1

Stack Overflow用户

发布于 2015-06-22 09:40:26

如果你有一个3x2矩阵,应该用随机排列中的数字1,1,2,2,3,3填充,那么你可以这样做:

  1. 为当前数组分配一个大小合适的数组(向量),该数组具有正确的值-6\f25 1,1,2,2,3,3。
  2. 使用适当的技术对数组进行混洗,然后将混洗后的数据复制到目标2D数组中。
  3. 或从最初的6个选项中随机选择一个数字,然后(如有必要)将最后一个数字移动到洞中,并从其余5个选项中选择下一个数字,依此类推。

您可以使用Fisher-Yates混洗算法。您可以签入您的Knuth The Art of Computer Programming, Volume 2: Seminumerical Algorithms副本。或者你可以查找关于Stack Overflow的论述(比如Algorithm to select a single random combination of values,之所以选择它,是因为我在谷歌上的搜索也遇到了它)。

从注释中可以看出,您希望从rand()代理中获得副本,因此这应该是可行的:

代码语言:javascript
复制
int duprand(void)
{
    static int mode = 0;
    static int value = 0;
    if (mode == 0)
    {
        mode = 1;
        value = rand();
    }
    else
    {
        mode = 0;
    }
    return value;
 }

或者,更简洁地说:

代码语言:javascript
复制
int duprand(void)
{
    static int mode = 0;
    static int value = 0;
    if (mode == 0)
        value = rand();
    mode = !mode;
    return value;
 }

每次需要一个随机数时,只需调用duprand()即可。您将连续两次获得相同的值。这段代码没有提供重新同步方法;如果你想要一个,你可以很容易地编写一个:

代码语言:javascript
复制
void sync_duprand(void)
{
    int i = duprand();
    int j = duprand();
    if (i != j)
       i = duprand();
}

我真正想要的是...

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

extern void shuffle(int *array, int n);
/*
** rand_int() and shuffle() copied verbatim (but reformatted) from
** https://stackoverflow.com/a/3348142 - an answer by Roland Illig
** (https://stackoverflow.com/users/225757/roland-illig).
*/

static int rand_int(int n)
{
    int limit = RAND_MAX - RAND_MAX % n;
    int rnd;

    do
    {
        rnd = rand();
    } while (rnd >= limit);
    return rnd % n;
}

void shuffle(int *array, int n)
{
    int i, j, tmp;

    for (i = n - 1; i > 0; i--)
    {
        j = rand_int(i + 1);
        tmp = array[j];
        array[j] = array[i];
        array[i] = tmp;
    }
}

/* New code - but hardly novel code */
static void dump_matriz(int matriz[4][4])
{
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
            printf("  %d", matriz[i][j]);
        putchar('\n');
    }
}

int main(void)
{
    int matriz[4][4];

    int *base = &matriz[0][0];
    for (int i = 0; i < 8; i++)
    {
        *base++ = i + 1;
        *base++ = i + 1;
    }

    printf("Before:\n");
    dump_matriz(matriz);

    shuffle(&matriz[0][0], 16);

    printf("After:\n");
    dump_matriz(matriz);

    return 0;
}

示例输出:

代码语言:javascript
复制
Before:
  1  1  2  2
  3  3  4  4
  5  5  6  6
  7  7  8  8
After:
  1  7  8  6
  6  2  5  8
  2  4  7  3
  3  5  1  4

请注意,因为没有调用srand(),所以排列是固定的。(您可能会得到与我所显示的结果不同的结果,但是多次运行此测试将在您的机器上产生相同的结果。)通过适当的初始化添加对srand()的调用,您会得到不同的序列。Hack and chop,以满足您对较小矩阵的要求。

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

https://stackoverflow.com/questions/30970418

复制
相关文章

相似问题

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