关于C#:在范围内生成一个随机数?

Generate a random number within range?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Generating Random Numbers in Objective-C

如何生成范围内的随机数?


这实际上比大多数人意识到的更难得到真正的正确:

1
2
3
4
5
6
7
8
9
10
11
12
13
int rand_lim(int limit) {
/* return a random number between 0 and limit inclusive.
 */


    int divisor = RAND_MAX/(limit+1);
    int retval;

    do {
        retval = rand() / divisor;
    } while (retval > limit);

    return retval;
}

仅使用%(或等同于/)来获取范围内的数字的尝试几乎不可避免地会产生歪斜(即,某些数字的生成频率会比其他数字更高)。

至于为什么使用%会产生歪斜的结果:除非您想要的范围是rand_max的除数,否则歪斜是不可避免的。如果你从小数字开始,很容易就能知道为什么。考虑拿10块糖果,试着把它平均分配给三个孩子。显然,这是不可能的——如果你把所有的糖果都分发出去,你能得到的最接近的是两个孩子得到三块糖果,其中一个得到四块。

对于所有的孩子来说,只有一种方法可以得到相同数量的糖果:确保你根本不分发最后一块糖果。

为了将这与上面的代码联系起来,让我们从1到10的糖果和1到3的孩子开始编号。最初的除法是说既然有三个孩子,我们的除数是三。然后,我们从桶里拿出一个随机的糖果,看它的数字,除以3,然后把它递给那个孩子——但是如果结果大于3(即,我们选了10号糖果),我们根本就不分发它——我们丢弃它,然后再挑选一个糖果。

当然,如果您使用的是C++的现代实现(即支持C++ 11或更新的一个),那么通常应该使用标准库中的一个EDCOX1和3个类。上面的代码与std::uniform_int_distribution最接近,但是标准库还包括uniform_real_distribution以及一些非均匀分布的类(伯努利、泊松、正态,可能还有一些我现在不记得的类)。


1
2
3
4
int rand_range(int min_n, int max_n)
{
    return rand() % (max_n - min_n + 1) + min_n;
}

分数:

1
2
3
4
double rand_range(double min_n, double max_n)
{
    return (double)rand()/RAND_MAX * (max_n - min_n) + min_n;
}


对于范围[最小值,最大值]内的整数值:

1
2
double scale = (double) (max - min) / RAND_MAX;
int val = min + floor(rand() * scale)


我在obj-c中专门为一个iPhone项目写了这个:

1
2
3
4
5
6
7
- (int) intInRangeMinimum:(int)min andMaximum:(int)max {
    if (min > max) { return -1; }
    int adjustedMax = (max + 1) - min; // arc4random returns within the set {min, (max - 1)}
    int random = arc4random() % adjustedMax;
    int result = random + min;
    return result;
}

使用:

1
int newNumber = [aClass intInRangeMinimum:1 andMaximum:100];

加盐调味


1
2
3
4
5
6
7
8
9
10
+(NSInteger)randomNumberWithMin:(NSInteger)min WithMax:(NSInteger)max {
    if (min>max) {
        int tempMax=max;
        max=min;
        min=tempMax;
    }
    int randomy=arc4random() % (max-min+1);
    randomy=randomy+min;
    return randomy;
}

我在一个随机数相关的类中使用这个方法。对于我不需要的需求很有效,但在某种程度上可能有偏见。