算法练习-随机数

问题表述:生成小于n且没有重复的k个整数的问题。

输入:n,k。

输出:0-n-1之间的k个不同随机顺序的随机整数。

随机数产生函数为rand(),函数的作用是生成一个0~RAND_MAX之间的一个随机数,返回值是一个unsigned int类型值,代码如下。

#include <iostream>

using namespace std;

void main()

{

for (int i = 0; i < 10; ++i)

{

cout<<rand()<<" ";

}

cout<<endl;

}

之前看过有一篇博文上说,随机数函数就好像是在翻字典。系统给你预设好一本字典。你来调用rand()就好像按照顺序来一页一页翻,所以两次的运行结果基本是一模一样的。要想真正的随机,按理来说是不可能的。但是我们可以加上随机数种子。设置时间为随机数种子,srand((unsigned)time(NULL));现在调用rand()就像按照时间的顺序来翻字典,时间不停在变,翻字典的顺序也在变。这样就基本实现了随机。

题目中还要求了产生不相同的随机数。就每产生一个随机数,就与之前产生的逐个比较,比较相同就抛弃,重新产生。代码实例如下:

#include<iostream>
           #include<time.h>

using namespace std;

int main()
          {
                int x[1000];             //暂时使用1000
                int n=0, k=0;
                cin >> k>> n;
                bool ret = false;          //设置一个标记位
                srand((unsigned)time(NULL));       //给随机数添加随机种子
                for (int a = 0; a < n;a++ )      //将数组初始化
                {
                       x[a] = a;
                }
                int i = 0;
                while (1)
                {
                        x[i] = rand() % n+1;          //产生第i个随机数
                        for (int j = 0; j < i; j++)
                        {
                                if (x[i] == x[j])          //与之前产生的随机数比较,如果相同就将标记为设为true
                                {
                                      ret = true;
                                }
                        }
                        if (!ret)           //如果与之前产生的不相同,就产生下一个随机数
                        {
                                 i++;
                                 ret = false;
                         }
                         if (i == k)     //到第k个跳出循环
                         {
                                 break;
                         }
                }
                for (int c = 0; c < k; c++)  //打印随机数数组
                {
                         cout << x[c] << ‘ ‘;
                }
                return 0;
         }

这个还有一个问题就是如果n和k设置的过于接近的话,产生随机数的时候会发生碰撞,在最后几位随机数产生的过程中会一直产生与之前相同的随机数,不断被抛弃,不断的产生。这个还需要改进。

时间: 2024-10-23 09:13:17

算法练习-随机数的相关文章

机器学习算法中随机数的生成

numpy,sklearn提供随机数据生成功能,我们可以自己生成适合某一种模型的数据,用随机数据来清洗,归一化,转换,然后选择模型与算法做拟合和预测. 1.numpy随机数据生成API numpy比较适合用来生产一些简单的抽样数据.API都在random类中,常见的API有: (1).rand(d0, d1, ...,dn)用来生成d0xd1x...dn维的数组.数组的值在[0, 1]之间. (2).randn(d0, d1, ...,dn),也是用来生成d0xd1x...dn维的数组.不过数组

随机化算法之随机数

首先是介绍: 代码如下: //随机数类 //Random.hpp //===================================================== #ifndef RANDOM_HPP #define RANDOM_HPP #include<ctime> const unsigned long maxshort = 65536L; const unsigned long multiplier = 1194211693L; const unsigned long a

梅森算法生成随机数的Python实现

import time class Util(object): def __init__(self): self.index = 624 self.MT = [0] * 624 def inter(self,t): return (0xFFFFFFFF & t) # 取最后32位->t def twister(self): for i in range(self.index): y = self.inter((self.MT[i] & 0x80000000) + (self.MT[(

舍伍德算法(转 用来说明算法导论题目!!!)

随机化算法(3) — 舍伍德(Sherwood)算法 已出连载: 1.<随机化算法(1) — 随机数> 2.<随机化算法(2) — 数值概率算法> 正文: 这一章怎么说呢,我个人感觉不好理解,在网上查了一些资料,没发现有具体对舍伍德算法的介绍. 迄今为止看的最全面的就是王晓东的<计算机算法设计与分析>里讲的了.在网上查的一些资料也基本全和这本书上讲的一样,至于是这本书先写的,还是其他位置先写的,我就不做评论了. (有时间我把那本书上讲舍伍德的一段给拍下来放到文章里) 书

数值概率算法(转 用来说明算法导论题目!!!)

随机化算法(2) — 数值概率算法 接着上一篇: 随机化算法(1) — 随机数 在这章开篇推荐下chinazhangjie总结的随机算法,因为咱两看的是同一本书,所以大家也可以去参考下他的,总结的很不错. http://www.cnblogs.com/chinazhangjie/archive/2010/11/11/1874924.html (顺便再PS一下,小杰也是我论坛的C/C++问题求助板块的版主,C/C++小牛) 这一章我就把书中的一个例子举出来了,感觉虽然很简单,但是很有意思. 用随机

拉斯维加斯算法(转 用来说明算法导论题目!!!)

Monte Carlo algorithm will return an answer that is not necessarilycorrect within a reasonable amount of time.Las Vegas algorithm may take infinite time to compute an answer, butthe answer is guaranteed to be correct. 随机化算法(4) — 拉斯维加斯(Las Vegas)算法 已出

[nRF51822] 16、nRF51822的随机数生成器,及随机数生成器的一些知识(可以帮您补补随机数发生器的知识)

1.前言 随机数生成器在通信.加密.图像传输等领域应用广泛,且一般起到关键性作用.我在最近设计的一个近场射频通信协议的碰撞避退算法的过程中,便对此有深深体会. 2.伪随机数发生器 随机数发生器一般包括伪随机数发生器和真随机数发生器.伪随机数发生器的伪随机序列是由数学公式计算产生,如果生成随机数的算法确定了,那么这个随机数序列也就确定了.所以从数学意义上讲,伪随机数并不随机,序列本身也必然会重复.但是只要伪随机数发生器所产生的伪随机序列的周期足够成并且通过相应的检验,就可以在一定范围内使用.而且伪

游戏开发常用算法概述

游戏开发属于软件开发中的一种,但又是非常特殊的一种. 游戏开发几乎可以用到软件设计中的任何一种算法,任何一种设计模式,任何一种编程思想,较普通的软件开发,难度相对要大一些. 游戏几乎模拟出一个完整的世界. 下面是我收集的一些常用的算法.设计模式及变成思想,欢迎拍砖和补充. 一 算法 1 随机数 常用于抽装备,暴击,闪避等 2 最短路径 用于地图中寻找到达指定位置的最短路径,dota,LOL中,点击地图上任一可达的点,英雄单位就会找到最短的路径,到达指定点. 不知道有木有人玩起凡,起凡中的寻路算法

开源Math.NET基础数学类库使用(12)C#随机数扩展方法

原文:[原创]开源Math.NET基础数学类库使用(12)C#随机数扩展方法                本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 开源Math.NET基础数学类库使用总目录:http://www.cnblogs.com/asxinyu/p/4329737.html 前言 真正意义上的随机数(或者随机事件)在某次产生过程中是按照实验过程中表现的分布概率随机产生的,其结果是不可预测的,是不可见的.而计算