[算法][随机数]一种生成2个不相同的随机数的方法

[引子]

下面以C语言为例进行描述。

设min和max为所要生成的数的取值范围,

设函数rand(min,max)能返回取值范围为[min,max)的随机数,

两个随机数分别为num1和num2,则标题所描述的功能可以这样实现:

void f(int min,int max){
    int num1=rand(min,max);
    int num2;
    do{
        num2=rand(min,max)
    }while(num2!=num1)
    printf("the 1st number is %d\n",num1);
    printf("the 2nd number is %d",num2);
}

[分析和改进]

上述算法在某些情况下,例如当rand()返回整数,且max=min+1,

或者在最最极端的情况下,会发生死循环。可以用下面的算法代替:

代码为:

void f(int min,int max){
    int len=max-min;
    int num1=rand(0,len);
    int dist=rand(1,len);
    int num2=(num1+dist)%len;
    num1+=min;
    num2+=min;
    printf("the 1st number is %d\n",num1);
    printf("the 2nd number is %d",num2);
}
 
在这个算法中,num1/num2既可以为整数,也可以为浮点数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值