如何从范围生成随机数而不为零

时间:2018-02-26 09:48:59

标签: c

这是我的功能

int nepresnost_N2(int S){

    int N2, N2_1, N2_2; 
    N2_1 = -S/10;
    N2_2 = S/10;    
    N2 = rand() % (N2_2 + 1 - N2_1) + N2_1; 
    printf("%i", N2);

}

我不知道如何为(没有0)创造条件。 任何想法,谢谢:))

2 个答案:

答案 0 :(得分:5)

如果您希望图纸在[a, b]范围内,不包括零,则在[a, b - 1]中生成一个随机数,如果返回的值为非负数,则为其添加1。

这将具有优于取样和拒绝0值的统计特性。

答案 1 :(得分:5)

由于您的范围既有正面也有正面,从-s+s,您可以将范围的正部分缩短1,然后在生成的值时加1是否定的:

N2_1 = -S/10;
N2_2 = S/10-1; // Shrink by one    
N2 = rand() % (N2_2 + 1 - N2_1) + N2_1;
if (N2 >= 0) { // Correct for zero
    N2++;
}

或者,您可以将结果检查为零,并在必要时生成新数字:

int nepresnostNoZero(int S) {
    int res;
    do {
        res = nepresnost_N2(S);
    } while (res == 0);
    return res;
}