函数srand用C - 只用一个重复(srand in C - with just one rep

2019-10-23 10:49发布

我试图建立一个记忆游戏,我想问我怎么能产生只有一个重复一个randomic数。 像1-1,2-2,3-3。 我会在这里贴上我的功能,我创建并告诉我,如果我要创建另一个函数只是为了创造条件创建刚刚从数字一对。

// 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
}

Answer 1:

如果您有需要填入一些随机排列数字/数字1,1,2,2,3,3 3×2矩阵,那么你可以这样做:

  1. 分配适当的大小的阵列(矢量) - 6为当前的例子。
  2. 填充阵列与正确的值 - 1,1,2,2,3,3为当前的例子。
  3. 使用合适的技术来洗牌阵列,然后将混洗数据复制到所述目标2D阵列。
  4. 或随机地从最初的6个选项选择一个数值,然后(如果必要的话)移动至最后一位到孔和从剩余的5个选项,等等选择下一个数字

您可以使用费雪耶茨洗牌算法。 你可能会检查您的克努特副本计算机程序设计,第2卷的艺术:半数值算法 。 或者,你可以看看堆栈溢出博览会(如算法来选择值的单一的随机组合 ,选择了,因为我的谷歌搜索一个也碰到它)。


从评论来看,你从你想重复rand()的替代,所以这应该工作:

int duprand(void)
{
    static int mode = 0;
    static int value = 0;
    if (mode == 0)
    {
        mode = 1;
        value = rand();
    }
    else
    {
        mode = 0;
    }
    return value;
 }

或者,更简洁:

int duprand(void)
{
    static int mode = 0;
    static int value = 0;
    if (mode == 0)
        value = rand();
    mode = !mode;
    return value;
 }

只需拨打duprand()你想有一个随机数各一次。 您将连续得到相同的值的两倍。 此代码不提供再同步方法; 如果您想要一个,你可以写一个很轻松了:

void sync_duprand(void)
{
    int i = duprand();
    int j = duprand();
    if (i != j)
       i = duprand();
}

我真正想要的是......

#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;
}

输出示例:

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()与相应的初始化,你会得到不同的序列。 黑客和印章,以适应较小的矩阵您的要求。



文章来源: srand in C - with just one repetition