Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何使用错误的生成器获取随机数_Objective C_Algorithm_Random - Fatal编程技术网

Objective c 如何使用错误的生成器获取随机数

Objective c 如何使用错误的生成器获取随机数,objective-c,algorithm,random,Objective C,Algorithm,Random,问题:假设您有一个随机数生成器randn(),它返回0到n-1之间均匀分布的随机数。给定任意数字m,编写一个随机数生成器,返回0和m-1之间均匀分布的随机数 我的答覆是: -(int)randm() { int k=1; while (k*n < m) { ++k; } int x = 0; for (int i=0; i<k; ++i) { x += randn(); } if (x <

问题:假设您有一个随机数生成器randn(),它返回0到n-1之间均匀分布的随机数。给定任意数字m,编写一个随机数生成器,返回0和m-1之间均匀分布的随机数

我的答覆是:

-(int)randm() {
    int k=1;
    while (k*n < m) {
        ++k;
    }
    int x = 0;
    for (int i=0; i<k; ++i) {
        x += randn();
    }
    if (x < m) {
        return x;
    } else {
        return randm();
    }
}
-(int)randm(){
int k=1;
而(k*n对于(int i=0;i你很接近,但是你的答案的问题是,有不止一种方法可以将一个数字写成另外两个数字的和

如果
mn^e){
++e;
}
//求m小于n^e的最大倍数
int k=1;
而(k*m
您正在添加均匀随机数,这不会产生均匀随机结果。假设n=2和m=3,则x的可能值为0+0、0+1、1+0、1+1。因此,得到1的可能性是得到0或2的可能性的两倍


您需要做的是将m写入n进制,然后生成随机数的n进制表示形式的“数字”。当您有完整的数字时,您必须检查它是否小于m。如果小于m,则完成。如果不小于m,则需要重新开始。

两个均匀随机数生成器的和不是均匀生成的.例如,两个骰子的总和更可能是7而不是12,因为要得到12,你需要掷两个6,而你可以得到7作为1+6或6+1或2+5或5+2或


假设randn()返回一个介于0和n-1之间的整数,则n*randn()+randn()均匀分布在0和n*n-1之间,因此可以增加其范围返回一个介于0和k*m+j-1之间的整数,然后反复调用它,直到得到一个数字假设n和m都是正整数,那么标准的缩放算法不起作用吗

return (int)((float)randn() * m / n);

你有关于
n
m
的任何其他信息吗?问题的一部分是我需要对n和m进行什么假设才能使这一点起作用,但我认为它适用于任何数字。你假设了关于n的许多事情,m:1)两者都是整数,2)都是正数除非n是m的精确倍数,否则分布是不均匀的。如果m>n,某些值将丢失。(尝试m=3,n=2:您将只得到0和1,永远不会得到2。)如果mP(0)=1/4 P(1)=1/2 P(2)=1/4
int randm() {

    // find largest power of n needed to write m in base n
    int e=0;
    while (m > n^e) {
        ++e;
    }

    // find largest multiple of m less than n^e
    int k=1;
    while (k*m < n^2) {
        ++k
    }
    --k; // we went one too far

    while (1) {
        // generate a random number in base n
        int x = 0;
        for (int i=0; i<e; ++i) {
            x = x*n + randn(); 
        }
        // if x isn't too large, return it x modulo m
        if (x < m*k) 
            return (x % m);
    }
}
return (int)((float)randn() * m / n);