关于随机数列,对给定数目的自0开始步长为1的数字序列进行乱序。(可用作洗牌)

1 /**
 2  * 数组乱序类
 3  * @author noam 
 4  */
 5 public class NRandom {
 6 
 7     /**
 8      * 对给定数目的自0开始步长为1的数字序列进行乱序
 9      * @param no 给定数目
10      * @return 乱序后的数组
11      */
12     public static int[] getSequence(int no) {
13         int[] sequence = new int[no];
14         for(int i = 0; i < no; i++){
15             sequence[i] = i;
16         }
17         Random random = new Random();
18         for(int i = 0; i < no; i++){
19             int p = random.nextInt(no);
20             int tmp = sequence[i];
21             sequence[i] = sequence[p];
22             sequence[p] = tmp;
23         }
24         random = null;
25         return sequence;
26     }
27

 此代码关键在于,第18行到22行,关键在于中间值

每一次循环
都会生成1个随机数值,int p   这数值对应1个随机的位置

本来顺序为0-b的顺序排列,

每次随机出来的位置,和顺序排列的位置   
里面的每一个元素进行互换,

达到每个位置
都和随机位置互相交换元素后,形成一个全新的随机数列,每一个位置上的值都是随机数列赋的

关键字
:生成随机数列,和当前位置互相,达到随机目的。

引用:http://www.cnblogs.com/noam/archive/2011/03/14/1983974.html

时间: 2024-10-05 04:45:12

关于随机数列,对给定数目的自0开始步长为1的数字序列进行乱序。(可用作洗牌)的相关文章

给定斐波那契数列的项数求对应的数值的普通方法和优化处理

1 /** 2 给定斐波那契数列的项数求对应的数值 3 参考:剑指Offer 4 */ 5 #include <stdio.h> 6 7 int fib(int n); 8 long long fibonacci(unsigned int n); 9 int main(int argc, const char * argv[]) { 10 11 int n; 12 13 while (1) { 14 15 printf("请输入你想知道到的斐波那契数列的项数:\t"); 1

[bzoj4282]慎二的随机数列_动态规划_贪心

慎二的随机数列 bzoj-4282 题目大意:一个序列,序列上有一些数是给定的,而有一些位置上的数可以任意选择.问最长上升子序列. 注释:$1\le n\le 10^5$. 想法:结论:逢N必选.N是可以任意选择的位置. 具体的,我们将所有N踢出序列,将给定的权值-=前面N的个数.再在当前序列上求最长上升子序列. 正确性的话如果当前序列中的数: 如果前面的数小于后面的数,显然中间的N我也可以加上. 如果前面的数大于后面的数: 如果前面的数在原序列中的权值大于后面的数在原序列中的权值,那么这两个数

Openjudge NOI题库 ch0111/07 和为给定数

总时间限制: 1000ms 内存限制: 65536kB 描述 给出若干个整数,询问其中是否有一对数的和等于给定的数. 输入 共三行:第一行是整数n(0 < n <= 100,000),表示有n个整数.第二行是n个整数.整数的范围是在0到10^8之间.第三行是一个整数m(0 <= m <= 2^30),表示需要得到的和. 输出 若存在和为m的数对,输出两个整数,小的在前,大的在后,中间用单个空格隔开.若有多个数对满足条件,选择数对中较小的数更小的.若找不到符合要求的数对,输出一行No

给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X

题目:给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X 思路一: 1,先采用归并排序对这个数组排序, 2,然后寻找相邻<k,i>的两数之和sum,找到恰好sum>x的位置,如果sum=x则返回true, 3,找到位置后,保持i不变,从k处向前遍历,直到找到A[k]+A[i]等于x,并返回TRUE,如果找不到,则返回false. 论证步骤3:当前找到的位置恰好A[k]+A[i]>x,且前一位置的sum<x: 所以A[i]前面的数(不包括A[i])无论取哪两个数都

根据权重随机选取指定条数记录的简单算法实现(C#)

一.应用场景: 有时我们需要从一些列数据中根据权重随机选取指定条数记录出来,这里需要权重.随机,我们根据权重越大的,出现概率越大.例如广告系统:可根据客户支付金额大小来调控客户们的广告出现概率,客户支付金额越大,其广告出现频率越频繁,例如:加入有10条广告,然后每条广告都有一个权重,我们每次要根据权重选取5条广告出来进行显示.有了需求,我们就进行解决,本文章就是利用一种简单的算法来实现根据权重来随机选取. 二.简单算法的实现: 根据我们需求,上网找了不少资料,都没有找到一种比较适合的方案,就自己

Fibonacci数列是这样定义的: F[0] = 0 F[1] = 1 for each i ≥ 2: F[i] = F[i-1] + F[i-2] 因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1

Fibonacci数列是这样定义的:F[0] = 0F[1] = 1for each i ≥ 2: F[i] = F[i-1] + F[i-2]因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数.给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数. 输入描述: 输入为一个正整数N(1 ≤ N

数组 冒泡排序 打印菱形 随机生成不同的数

判断一个数是否是质数  对这个数从1到这个数挨着取余 如果取余等于零则计数+1,所以当计数=2是  那么说明这个数只能被一和它本身整除 所以它是质数 打印菱形  每一行首先打印空格  然后打印符号 先打印上半部分 然后下半部分 这时候中间两行出现重复 那么需要去掉一行 数组 冒泡排序 首先定义数组 利用for循环把值输入到数组里边 后利用两个for循环 把数组里的数挨个比较 排序 如果a[i]<a[i+i] 然后进行交换 那么是降序输出 如果a[i]>a[i+1] 然后交换了  那么是升序排列

golang获取一串数字中与给定数最接近的数字

今天需要写一个算法,获取一串数字中与给定数最接近的数字,代码如下 package main import ( "fmt" ) func main(){ arr:=[]int{12,16,29,34,39,43,55,64,71,89,90,9} zuijin:=get_zuijin(40,arr) fmt.Println(zuijin) } func get_zuijin(this int,arr []int) int{ min:=0 if this==arr[0]{ return a

STM32F103ZET6 用定时器级联方式输出特定数目的PWM

STM32F103ZET6 用定时器级联方式输出特定数目的PWM STM32F103ZET6里共有8个定时器,其中高级定时器有TIM1-TIM5.TIM8,共6个. 这里需要使用定时器的级联功能,ST的RM0008 REV12的P388和P399页上有说明对于特定的定时器,怎么去选择级联功能,参见表86. 我这里输出PWM的定时器是TIM2,空闲的定时器是TIM3.以TIM2为主定时器,TIM3为从定时器对TIM2的输出脉冲数进行计数. 查表可知,TIM3为从定时器选择TIM2为触发源,需要配置