生成真正的随机数(非伪随机数)

之前无论怎么样同个程序同个地方生成的随机数都是同样的后来才明白,如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的。

rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生一系列随机数。如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的。srand(unsigned seed)通过参数seed改变系统提供的种子值,从而可以使得每次调用rand函数生成的伪随机数序列不同,从而实现真正意义上的“随机”。通常可以利用系统时间来改变系统的种子值,即srand(time(NULL)),可以为rand函数提供不同的种子值,进而产生不同的随机数序列------从百度百科上复制粘贴

srand放在程序的最前面可以让每次同个地方生成的随机数都是真正随机的   

例   srand(time(0));

这是从考试的的一道题目上看到的(非常不正经的一场考试1.打表2.卡不掉的随机算法3.这题还好)

--------------------------------------------------------------------------------分割线--------------------------------------------------------------------------------

例题:

这是第2题

 双子时空(back.cpp\c\pas)

【问题描述】
你救出了小丁。
这激怒了双胞胎们。
他们祭出大招——“双子时空”。你和小丁分别被关在两个时空里,小丁的时空里有一个1
到n的排列,他被要求给出这个排列的一个最长上升子序列;你的时空里可以看到小丁给出的最
长上升子序列,你需要推断出原排列是什么。显然,可能有很多数列满足这个最长上升子序列,
你想要知道这样的排列有多少,从而计算出自己答对的概率。
…………
【输入格式】
第 1 行一个正整数 n;
第 2 行一个正整数 k,表示最长上升子序列的长度;
第 3 行 k 个整数,表示这个最长上升子序列。
【输出格式】
一行一个整数,表示原排列的可能数。

【输入输出样例】
back.in
5
3
1 3 4

back.out
11
【样例解释】
11种排列分别为(1, 3, 2, 5, 4), (1, 3, 5, 2, 4), (1, 3, 5, 4, 2), (1, 5, 3, 2,
4), (1, 5, 3, 4, 2), (2, 1, 3, 5, 4), (2, 1, 5, 3, 4), (2, 5, 1, 3, 4), (5, 1, 3,
2, 4), (5, 1, 3, 4, 2), (5, 2, 1, 3, 4)。

【数据范围】
对于前 30%的数据 n ≤ 8。
对于 100%的数据 1 ≤ k ≤ n ≤ 15。
数据有一定梯度。

蒟蒻的代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define C getchar()-48
inline int read()
{
    int s=0,r=1;
    char c=C;
    for(;c<0||c>9;c=C) if(c==-3) r=-1;
    for(;c>=0&&c<=9;c=C) s=(s<<3)+(s<<1)+c;
    return s*r;
}
int n;
const ll R=1420000;
struct xin{
	ll x,y,id,ran;
}a[5001000]; 
bool pd(xin a,xin b)
{
	return a.ran<b.ran;
}
int ans[5001000];
int main()
{
	freopen("jump.in", "r", stdin);
	freopen("jump.out", "w", stdout);
	srand(time(0));//使用-使用-使用-使用-使用-使用-使用-使用-使用-使用-使用-使用-使用-使用-使用-使用-使用-使用
    n=read();
    ll x=0,y=0;
    for(int i=1;i<=n;i++)
	   a[i].x=read(),a[i].y=read(),a[i].id=i;
	while(1)
	{
		for(int i=1;i<=n;i++)
		  a[i].ran=1ll*rand()*rand();//生成随机数-生成随机数-生成随机数-生成随机数生成随机数-生成随机数
		sort(a+1,a+1+n,pd);
		for(int i=1;i<=n;i++)
		{
			int xx=a[i].x,yy=a[i].y;
			if((x+xx)*(x+xx)+(y+yy)*(y+yy)<(x-xx)*(x-xx)+(y-yy)*(y-yy)) x+=xx,y+=yy,ans[a[i].id]=1;
			else x-=xx,y-=yy,ans[a[i].id]=-1; 
		}
		if(x*x+y*y<=R*R)
		{
			for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
			return 0;
		}
	}
    fclose(stdin);
    fclose(stdout); 
    return 0;
}  

 

posted @ 2018-08-25 21:11  1436177712  阅读(410)  评论(0编辑  收藏  举报