Chinaunix首页 | 论坛 | 博客
  • 博客访问: 330693
  • 博文数量: 73
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1293
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-07 11:17
个人简介

爱运动,爱看书,爱生活!

文章分类

全部博文(73)

文章存档

2014年(7)

2013年(66)

分类: C/C++

2013-08-28 14:01:36

问题一、给定一个数组,要求把数组内元素的顺序随机打乱,然后输出,主要是要保证效率。
       这个算法其实简单,首先从所有元素中随机选取一个与第一个元素进行交换,然后在第二个之后选择一个元素与第二个交换,直到最后一个元素。
这样能确保每个元素在每个位置的概率都是1/n。代码如下:

#include
#include
#include

// 随机打乱一个数组
void random(int a[], int n)
{
    int index, tmp, i;
    srand(time(NULL));
    for (i = 0; i
    {
        index = rand() % (n - i) + i;
        if (index != i)
        {
            tmp = a[i];
            a[i] = a[index];
            a[index] = tmp;
        }
    }
}
int main()
{
    int a[] = {1, 2, 3, 4, 5};
    int i;
    random(a, 5);
    for (i = 0; i < 5; i++)
        printf("%d ", a[i]);
    printf("\n");
    return 0;
}
把一个数组的顺序打乱,很常用的算法,比如洗牌。

问题二、给定一个文件,文件每行存放一个QQ号,请将其随机打乱:
awk 'BEGIN{srand()}{b[rand()NR]=$0}END{for(x in b)print b[x]}'  filename   

源:http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201361795553180/

阅读(1985) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~