c 语言中随机数填充数组,c – 生成唯一随机数的数组

这篇博客揭示了一个名为Knuth算法的简单示例,其在M等于N时的局限性。算法原意是生成有序随机数,但当限制条件导致初始rn和rm相同时,它无法实现真正的数组混洗。作者强调了正确应用该算法的关键,并讨论了如何调整参数以实现期望的数组打乱效果。
摘要由CSDN通过智能技术生成

在你引用的答案中,算法的C实现示例如下:

#define M 10

#define N 100

int in, im;

im = 0;

for (in = 0; in < N && im < M; ++in) {

int rn = N - in;

int rm = M - im;

if (rand() % rn < rm)

/* Take it */

vektor[im++] = in + 1; /* +1 since your range begins from 1 */

}

The Knuth algorithm. This is a very simple algorithm with a complexity of O(N) (i.e. the numeric range), meaning that it is most usable when M is close to N.

但是你设置M == N,它不是接近但是相等

所以rn和rm的初始值是相同的.所以这不能使算法正常工作,因为:

whatever % rn < rm

总是如此,如345436%22

I basically need to shuffle the array of numbers from 0 to n

这个算法并不是你所需要的:它根本不会对数组进行混洗,它会通过从不断增加的值中选择一个来产生有序的随机数(因此,唯一).像你一样限制值会强制算法发出范围的所有值.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值