随机序列问题

题目:

假设有一个数组,里面有10个元素 int a[10]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9}。请写一个算法,得到a数组的一个随机排列。要求时间复杂度尽量小,可以使用random函数。例如输出的随机序列可以是:3 6 2 4 5 1 9 8 0

思路:

1.将最大值max设置为9,在0~max之间产生一个随机数;

2.将数组a的max下标的值和产生下标的值互换,同时max--;

3.重复步骤1,2直到max==0停止循环,最后a中的数为原来数的随机排列。

代码如下:

#include<iostream>
#include<ctime>
using namespace std;
//定义交换数组元素函数
void ss(int a[],int x,int len)
{
    if(x!=len)
    {
        int temp=a[x];
        a[x]=a[len];
        a[len]=temp;
    }
}
//数组随机排列的实现
int* Rfan(int a[],int length)
{
    int len=length-1;
    while(len>0)
    {
        srand((int)time(NULL));//时间种子
        int x=rand()%(len+1);//产生随机数
        ss(a,x,len);
        len--;
    }
    return a;
}

int main()
{
    int a[10]={0,1,2,3,4,5,6,7,8,9};
    int *b=Rfan(a,10);
    for(int i=0;i<10;i++)
    {
        cout<<b[i]<<endl;
    }
}
时间: 2024-10-18 19:12:12

随机序列问题的相关文章

Python中生成一个没有重复元素的随机序列??

1 # 产生一个0-10的随机序列,元素不能重复 2 def randSeq(): 3 import random; 4 randSequence=random.sample(range(0,10),10); 5 return randSequence; 运行结果: 1 >>> randSequence 2 [0, 6, 4, 9, 3, 5, 1, 8, 2, 7] 3 >>>

Python中生成一个0-n的随机序列

Python中怎样生成一个随机序列? 代码例子如下:生成一个0-9的随机序列 1 >>> from numpy.random import normal,random,uniform; 2 >>> import numpy as np; 3 >>> random.permutation(range(10)) 4 Traceback (most recent call last): 5 File "<pyshell#2>"

Loj 2028 随机序列

Loj 2028 随机序列 连续的乘号会将序列分成若干个块,块与块之间用加减号连接: \[ (a_1*a_2*...a_i)\pm(a_{i+1}*a_{i+2}*...a_j)\pm... \] 除去所有都是乘号的一种,对于任意一个序列,总有与之对应唯一的另一个序列,它们所有的加减号都相反. 把这两个序列的和相加,就只剩下了 \(2*(a_1*a_2*...a_i)\),其中 \(i\) 为第一个加减号之前的位置. 那么平均下来,相当于每个序列的贡献为 \((a_1*a_2*...a_i)\)

r语言之生成随机序列,随机数生成函数及用法

(1)生成正态分布随机数: rnorm(n,mean,sd)     其中,n表示生成的随机数个数,mean表示正态分布均值,sd表示正态分布标准差 > rnorm(5,0,2)[1] -5.31147765 0.09634197 0.35276104 -1.94548466 0.54533883 (2)生成均匀分布随机数: runif(n,min,max)     其中,n表示生成的随机数个数,min表示均匀分布最小值,max表示均匀分布最大值 > runif(5,0,10)[1] 9.74

bzoj4597: [Shoi2016]随机序列

容易推出答案为$\sum_{i=1}^{n-1}2*3^{n-i-1}\prod_{j=1}^{i}a_{j}+\prod_{j=1}^{n}a_{j}$.然后随便怎么维护都行,我没多想直接用的区间乘区间和来搞,其实可以直接维护乘积和答案. #include<cstdio> #define Z int l=1,int r=n,int k=1 #define N 100005 #define M (l+r>>1) #define P (k<<1) #define S (k

bzoj 4597 随机序列

Description 你的面前有N个数排成一行.分别为A1, A2, … , An.你打算在每相邻的两个 Ai和 Ai+1 间都插入一个加号或者 减号或者乘号.那么一共有 3^(n-1) 种可能的表达式.你对所有可能的表达式的值的和非常感兴趣.但这毕竟太 简单了,所以你还打算支持一个修改操作,可以修改某个Ai 的值.你能够编写一个程序对每个修改都输出修改完 之后所有可能表达式的和吗?注意,修改是永久的,也就是说每次修改都是在上一次修改的基础上进行, 而不是 在最初的表达式上进行. Input

Matlab产生随机序列,并采样

clear all; M = 10; % bit数 符号数 N = 100; % 总采样数 L = N/M; % 每bit采样数 emp_rate = 0.5; % 占空比 imp = round(rand(1,M)); % round(...):四舍五入: rand(M,N):产生(0,1)之间的均匀分布的随机数,返回M*N的矩阵 % imp = randi([0,1],1,M); % randi([iMin,iMax],m,n) 在[iMin,iMax]生成随机整数,返回m*n的矩阵 sin

SHOI2016 随机序列

给你一个数列,在相邻两个数之间插入加号,减号或乘号 每次支持单点修改,求所有这样可以得到的表达式之和,膜1e9 + 7 sol: 我是个 sb ... 可以发现,如果某位置出现了加号,后面一定有一个减号把它消掉,于是答案就是一些出现了好几次的前缀积之和 算一下每段前缀积的贡献即可 #include<bits/stdc++.h> #define int long long using namespace std; inline int read() { int x = 0,f = 1;char

生成随机序列

利用vba生成8个随机数. Sub rndSer() tempA = Array(0, 1, 2, 3, 4, 5, 6, 7) For i = 7 To 1 Step -1 s = Int(Rnd() * (i + 1) + Second(Now())) Mod (i + 1) a = tempA(i) b = tempA(s) tempA(i) = b tempA(s) = a Next Range(Cells(1, 1), Cells(1, 8)).Resize = tempA End S