1. 程式人生 > >程式設計珠璣: 12章 取樣問題 12.1程式的輸入包含兩個整數m和n,其中m

程式設計珠璣: 12章 取樣問題 12.1程式的輸入包含兩個整數m和n,其中m

#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;
/*
問題:程式的輸入包含兩個整數m和n,其中m<n。輸出是0~n-1範圍內m個隨機整數的有序列表,不允許重複。從概率的角度說,我們希望得到沒有重複的有序選擇,其中
    每個選擇出現的概率相等。
分析:從剩餘r個數中選擇s個數的概率為s/r。
      舉例:假設m=2,n=5,即需要選擇2個數,數的範圍我0~4,
	  那麼如果在第一次已經選擇0的情況下,那麼第二次選擇1的概率為1/4(因為還需要從剩餘4個數中選擇1個數)
	  如果在第一次沒有選擇0的情況下,第二次選擇1的概率為2/4(還需要從剩餘4個數中選擇兩個數)。
	  所以,演算法步驟為:1 如果  隨機數 % 剩餘樣本個數 < 剩餘待選擇的個數 , 就選中當前下標,並使得剩餘帶選擇個數減少,並自動減少剩餘樣本個數;
	                      否則,只是減少剩餘樣本個數


輸入:
10(隨機選擇的數) 100(整數範圍n)
輸出:
10個不同元素組成的有序列表
*/

int randRange(int min , int max)
{
	if(min > max)
	{
		int temp = min;
		min = max;
		max = temp;
	}
	return ( rand() % (max - min + 1) + min );
}

//生成0~n-1中m個隨機選擇的不重複的陣列成的有序列表
vector<int> getRandomVector(int m , int n)
{
	vector<int> results;
	for(int i = 0 ; i < n ; i++)
	{
		//從剩餘n-i個數中選擇m個數的概率為 m/(n-i)
		int randValue = rand();
		if( randValue % (n-i) < m )
		{
			//選中當前數,就使得剩餘帶選擇個數減少
			m--;
			results.push_back(i);
		}
	}
	return results;
}


void print(vector<int>& results)
{
	if(results.empty())
	{
		cout << "no result" << endl;
		return;
	}
	int size = results.size();
	for(int i = 0 ; i < size; i++)
	{
		cout << results.at(i) << " ";
	}
	cout << endl;
}

void process()
{
	int m , n;
	vector<int> results;
	while(cin >> m >> n)
	{
		results = getRandomVector(m , n);
		print(results);
	}
}

int main(int argc , char* argv[])
{
	process();
	getchar();
	return 0;
}

相關推薦

程式設計珠璣 12 取樣問題 12.1程式輸入包含整數mn其中m

#include <iostream> #include <stdio.h> #include <vector> #include <algorithm> using namespace std; /* 問題:程式的輸入包含

程式設計珠璣 15 字串 15.2尋找字串中的最長重複子串 -------解題總結

#include <iostream> #include <stdio.h> #include <sstream> #include <stdlib.h>//qsort using namespace std; /* 問題:

編寫一個Java應用程式當用戶在輸入對話方塊中輸入日期後(日期格式為YYYYMMDD如1999年112日應輸入為19990112)程式將判斷日期的先後順序以及日期之間的間隔天數(例

編寫一個Java應用程式,當用戶在輸入對話方塊中輸入兩個日期後(日期格式為YYYYMMDD, 如1999年1月12日應輸入為19990112), 程式將判斷兩個日期的先後順序, 以及兩個日期之間的間隔天數(例如1999年1月1日和1999年1月2日之間的間隔是1天。  

C語言例項12——輸入整數mn求其最大公約數最小公倍數。

題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。 //程式分析:利用輾除法。 #include<stdio.h> int main(){ int a,b,num1,num2,te

程式6】  題目輸入整數mn求其最大公約數最小公倍數。

在迴圈中,只要除數不等於0,用較大數除以較小的數,將小的一個數作為下一輪迴圈的大數,取得的餘數作為下一輪迴圈的較小的數,如此迴圈直到較小的數的值為0,返回較大的數,此數即為最大公約數,最小公倍數為兩數之積除以最大公約數。 import java.util.Scanner;

程式6】 題目輸入整數mn求其最大公約數最小公倍數。

/* 2017年3月2日15:10:11 java基礎50道經典練習題 例6 Author:ZJY(&&) Purpose:最大公約數和最小公倍數的應用 最大公約數:把每個數分別分解質因數,再把各數中的全部公有質 因數提取出來連乘,所得的積就

c語言輸入整數mn求其最大公約數最小公倍數

輸入兩個正整數m和n,求其最大公約數和最小公倍數。解:程式:#include <stdio.h>int main(){int num1, num2, t,p;printf("請輸入兩個正整數

Java小程式輸入整數mn利用輾除法求其最大公約數

java:輸入兩個正整數m和n,求其最大公約數和最小公倍數。程式分析:利用輾除法。 程式執行截圖: 輾除法 輾轉相除法, 又名歐幾里德演算法(Euclidean algorithm)乃求兩個正整數之最大公因子的演算法。它是已知最古老的演算法, 其可追溯至3000年前。

程式16】 題目輸入整數mn求其最大公約數最小公倍數。

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> /* 【程式16】 題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。 【分析】 最大公約數:輾除法 最小公倍數:兩數之積除以最大公約數 */ int main(int argc,

程式設計珠璣》程式碼之路12如何用C/C++實現array[-1]並利用它寫出優美的程式碼

我們就以最大子陣列和為例: 最大子段和問題:給一組數,計算最大子段和。 在部落格:最大欄位和的6種解法,解法三中,我們提到了儲存前i項和的操作: cache[i]代表前i-1項之和,因為在c/c++中,cache[-1]會越界,所以如果用cache[i]代表前i項和的話,那麼在用遞推公式

Java語言程式設計 第十四 (14.1、14.2、14.3、14.4、12.5、14.6)

程式小白,希望和大家多交流,共同學習 因為沒有第十版的漢語電子書,(有的漢語版是第八版,使用的還是Swing)這部分內容只能使用英語版截圖。 14.1 //將image資料夾中的照片加載出來 import javafx.application.

程式設計珠璣第三 資料決定程式結構 習題解答

一.題目描述:本書出版之時,美國的個人收入所得稅分為5種不同的稅率,其中最大的稅率大約為40%.以前的情況則更為複雜,稅率也更高。下面所示的程式文字採用25個if語句的合理方法來計算1978年的美國

程式設計珠璣第7(初略估算)的閱讀體會

(2013.8寫在CSDN的文章) 近期在看Bentley的《程式設計珠璣》(第2版),看過一半就能斷定這是一本學演算法學程式設計必看的一本書。 書的前面幾章不需要參考很多背景資料,勤動筆演算就能有不錯的理解。但是第7章強調了不少常識和判斷方面的素質,因此需要一些背景知識作為參考。   第7

Java程式設計思想第一物件導論

第一章:物件導論     我們之所以將自然界分解,組織成各種概念,並按其含義分類,主要是因為我們是整個口語交流社會共同遵守的協議的參與者,這個協定以語言的形式固定下來...除非贊成這個協定中規定的有關語言資訊的組織和分類,否則我們根本無法交流。 抽象過程

1.程式設計實現 int(32位)整數mn的二進位制表達中 有多少個位(bit)不同? 輸入例子: 1999 2299 輸出例子:7

方法一: 演算法思想:由於要找兩個數對應不同位元位的個數,可以先將兩個數按位異或,然後再統計異或後的數中的一的個數,而統計二進位制中1的個數有三種方法;1.這個數迴圈按位 於比它小1的數,直到這個數為0為止;2.把這個數的每一個二進位制位拿出來,用的方法是和1相與,移位,迴

泛型 Java語言程式設計 第十九(19.1、19.2、19.3、19.4、19.5)

程式小白,希望和大家多交流,共同學習 19.1 //使用陣列實現棧,當陣列滿的時候,自動建立一個更大的陣列 import java.util.Arrays; public class Array

程式設計珠璣第八最接近0的的子向量

看了程式設計珠璣第八章中的內容,後面的課後練習也是非常的有意思,有一題是這麼說的,給定整數m和整數n和實數向量x[n], 請找出使總和x[i]+……+x[i+m]最接近0的整數i。 我這裡先不說明怎麼獲取最接近0的i,我先說明如何獲得與0最接近的子陣列之和。 看了寫網上有些

線性代數第一 行列式(1n階行列式 行列式的性質

第一節 n階行列式 一.數學概念 1. 逆序數 對於n個不同的元素,先規定各元素之間有一個標準次序(例如n個不同的自然數,可規定由小到大為標準次序),於是在這n個元素的任一排列中,當某兩個元素的先後次序與標準次序不同時,就說有1個逆序。一個排列中所有逆序的總數叫做這個排列

10.16輸入一個字符串內有數字非數字字符 a123x456 17960? 302tab5876 將其中連續的數字作為一個整數,依次存放到一數組num中。例如123放在num[0]中456放在num[1]中……統計共有多少個整數,並輸出這些數。

tab lnp zip sm2 cuc ycm rds qt5 tft 10.16輸入一個字符串,內有數字和非數字字符,如: a123x456 17960? 302tab5876 將其中連續的數字作為一個整數,依次存放到一數組num中。例

Pepper中級教程第二 如何將Python程式部署到機器人內部執行

2.1 目標 寫好的機器人程式,我們當然要脫離個人電腦,把這個程式部署到Pepper/Nao機器人內部執行。 2.2 實現思路 機器人的naoqi系統是基於Linux的系統,當然提供了FTP和SSH服務。 這兩個服務不需要安裝,是機器人自帶的。 2.2.1 FT