随机打乱一组数(出题)

 1 /*
 2 打乱一组数据a[0]~a[n-1]:
 3 给出0~n-1的编号,打乱这些编号,得到编号数组b[0]~b[n-1],
 4 现在的数据为a[b[0]],a[b[1]],…,a[b[n-1]]
 5 */
 6 #include <cstdio>
 7 #include <cstdlib>
 8 #include <cstring>
 9 #include <cmath>
10 #include <string>
11 #include <set>
12 #include <map>
13 #include <list>
14 #include <queue>
15 #include <vector>
16 #include <algorithm>
17 using namespace std;
18 const long n=100; //1e6
19 const long max_int=1<<15;//long 1<<15 ; unsigned long 1<<16
20 const long X=n/max_int+(n%max_int!=0);
21 const long Y=n%max_int;
22
23 long a[n],x,y;
24
25 int main()
26 {
27     FILE* fp=fopen("data.txt","w");
28     long i,j,index,t;
29     for (i=0;i<n;i++)
30         a[i]=i;
31     srand(0);
32     //每次确定a[i]的数值,index的数值是随机的,因而a[i]的数值也是随机的
33     //O(n)
34     for (i=n-1;i>=0;i--)
35     {
36         //分成两部分 v=max_int*x+y x=0..X-1 y=0..Y-1
37         index=floor(1.0*rand()/max_int*X) *max_int + floor(1.0*rand()/max_int*Y);
38         t=a[index];
39         a[index]=a[i];
40         a[i]=t;
41     }
42     for (i=0;i<n;i++)
43         fprintf(fp,"%ld ",a[i]);
44     fclose(fp);
45     return 0;
46 }

thanks for the help of a classmate

原文地址:https://www.cnblogs.com/cmyg/p/8965558.html

时间: 2024-10-11 18:30:26

随机打乱一组数(出题)的相关文章

随机打乱一组数据(算法)

最近一个项目的开发中遇到一个需求,有一组数1,2,3,4,5,6,7,8,0. 哈哈,如何将它随机打乱生成一个0-8的任意排列呢?比如生成0.6.1.2.3.4.5.7.8等等. 算法思路: 1.使用Arraylist存放这组数 2.随机生成Arraylist的下标值,根据下标值依次取出Arraylist值,直到Arraylist为空 哈哈,是不是很简单.......... 下面看代码: private static void genRandomData() { int data[] = { 1

求数组的最小数、最大值,求一组数的平均数,sort函数详解,类数组转数组

求数组的最小值和最大值 1 //求数组当中最大值和最小值 2 var arr=[3,2,6,1,45,23,456,23,2,6,3,45,37,89,30]; 3 //第一种方法 根据排序方法来求最大值和最小值 从小到大排序 第0位就是最小值 最后一位就是最大值 4 arr.sort(function(a,b){ 5 return a-b; //按从小大的情况排序 6 //return b-a; 按从大到小的情况排序 7 }) 8 console.log(arr); 9 var min=arr

C语言打乱一组数字顺序

#include<stdio.h> #include<stdlib.h> #include<math.h> #include<time.h> int main() { int a[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; int n=16; int i,j,T=1000,tmp; srand(unsigned(time(NULL))); while(T--) { i=rand()%n; j=rand()%n;

随机打乱数组元素

把数组内的元素随机打乱,重新进行排列  C#版: 1 public static void Shuffle<T>(T[] array) 2 { 3 Random random = new Random(); 4 5 for (int i = 0; i < 10; i++) 6 { 7 int idx = random.Next(i, 10); 8 9 //swap elements 10 T tmp = array[i]; 11 array[i] = array[idx]; 12 arr

算法练习1 用c#编写的一个判定一组数是否是有序的

//判定数组是否有序 //总的程序代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication5 { class Program { public static void Main(string[] args) { int index = 0; bool re

数组问题 1.行列有序二维数组中查找2.在一组数成对出现的数中有两个数只出现一次3.在移位数组中查找一个数

一.在一个二维数组中,每一行都按从左到右递增的顺序排序,每一列都按从上到下的递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路: 首先选取数组中右上角的数字.如果该数字等于要查找的的数字,查找过程结束:如果该数字大于要查找的数字,剔除这个数字所在的列:如果该数字小于要查找的数字,剔除这个数字所在的行.也就是说如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围剔除一行或一列,这样每一步都可以缩小查找的范围. 实现过程如下: 运行结果如下:

找出一组数中只出现一次的两个数,其他所有数都是成对出现的

题目: 给一组数,只有两个数只出现了一次,其他所有数都是成对出现的.怎么找出这两个数.编写函数实现. 题目分析: 上次介绍了,对于一组数中只有一个数只出现一次,其他所有数都是成对出现的,我们采用了对全部数组元素进行异或,但是对于找出两个出现一次的数应该怎么解决呢?先对所有的元素进行异或,则结果为两个出现一次的数的异或结果,然后将结果转换为二进制,找出二进制数中的第一个1,然后根据这个1的判断条件进行分组,分为两组,分别对两个组的元素进行全部异或,则就找出两个不同的数. 例如:数组中的元素为下面这

一组数中,只有两个数只出现了奇数次,其他所有数都是成对出现的,请找出那两个数

先看一个简单的,一组数中,只有一个数只出现了奇次,其他所有数都是成对出现的,找出出现奇次数的数.对于这个题,我们只需对所有数及逆行异或即可.理论公式: a⊕b=b⊕a a⊕0=a a⊕b⊕b=a a⊕(b⊕c)=(a⊕b)⊕c 代码: #include <stdio.h> #include <stdlib.h> int main() { int arr[] = { 1, 2, 3, 4, 1, 2, 3 }; int ret = 0; int len = sizeof(arr) /

统计随机生成的数出现次数

统计随机生成的数出现次数 /** * 功能:定义一个一维数组,其中存储随机生成的1000个1到100以内的整数,统计每个整数出现的次数 * 时间:2014年6月4日16:03:54 * 作者:cutter_point */ package com.lesson4; import java.util.*; public class Demo4_9 { public static void main(String [] args) { //1.生成1000个100以内的整数 int a[]=new