使用C从一系列数字中返回一个随机数

时间:2011-08-09 16:56:35

标签: c random

大小为n的整数数组。我需要生成一个数组的随机排列,给定一个函数rand_n(),它返回一个介于1和n之间的整数,包括两者,具有相同的概率。我知道java中的随机函数,但我想用C实现它。

5 个答案:

答案 0 :(得分:1)

也许mersenne twister就是您要搜索的内容。

答案 1 :(得分:0)

#include <stdio.h>
#include <stdlib.h>

int randint(int min, int max) 
{ 
    if (min>max) 
    { 
        return max+(int)((min-max+1)*rand()/(RAND_MAX+1.0)); 
    } 
    else 
    { 
        return min+(int)((max-min+1)*rand()/(RAND_MAX+1.0)); 
    } 
}

答案 2 :(得分:0)

您可以按如下方式创建自己的:

int rand_n( int N )
{
  return ( rand() % N ) + 1;
}

rand()stdlib.h中声明。

答案 3 :(得分:0)

如果我理解正确,那么问题不在于编写PRNG,而在于使用预定义的rand_n函数来编写一个算法来对数组进行混洗。写一个PRNG并不简单,我怀疑他们在接受采访时会问你。但是改组算法是一个不同的故事。这是一个以伪代码形式出现的问题:

迭代1:

  • 使用从1到N的数字填充数组,让我们称之为位置
  • i = rand_n(N);
  • shuffled [0] = toShuffle [positions [i]];
  • 从位置删除i并调整其大小(现在它具有N-1个元素)

迭代2:

  • i = rand_n(N-1)
  • shuffled [1] = toShuffle [positions [i]];
  • 从位置删除i并调整其大小(现在它有N-2个元素)

......抓住我的漂移?

答案 4 :(得分:0)

看一下Fisher-Yates shuffle。这通过随机交换元素产生数组的随机排列(因此使用简单的rand_n类型函数来选择元素。)