我想模拟随机发送52张标准卡而不使用rand / srand urandom等...
这是我的随机数函数
int rand2(int lim)
{
static int a = 34; // could be made the seed value
a = (a * 32719 + 3) % 32749;
return ((a % lim) + 1);
}
我将知道卡片是否已经弹出的结构(0 = NO,1 yes)
typedef struct s_game
{
int *cards;
int state;
unsigned int dat_rand;
} t_game;
int main()
{
t_game game;
int i;
int rd;
i = 0;
game.cards = malloc(sizeof(*game.cards) * 52);
while(i < 52)
{
rd = rand2(52);
if(game.cards[rd] == 0)
{
game.cards[rd] = 1;
printf("i:%d\n rd: %d\n", i, rd);
i++;
}
}
}
但是我的输出总是一样的,每张卡都是同时发送的,所以我正在搜索更好的随机功能或者用不同的方式来填充我的发送
答案 0 :(得分:6)
当然,您的数字序列将始终相同,计算机在此级别上具有极高的确定性。
要改进您的发电机,请使用例如“种子”计算机的当前正常运行时间,这是一种经典的方式。当然,只要种子相同,它仍将产生相同的序列。
更好的解决方法是"cryptographically secure pseudorandom numbers",它不是C的一部分,所以你必须做一些特定于平台的事情来掌握一些。不确定为什么你说你不“想”使用它;你必须得到适当的随机数字。
此外,由于计算机具有如此确定性,因此生成“真实”(或仅“好”)随机数非常困难。期望你自己解决这个问题是不合理的,特别是因为(没有冒犯)你似乎对C编程很陌生。我个人在尝试推出自己的随机安全之前肯定会犹豫不决发生器。