程式設計珠璣: 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程式的輸入包含兩個整數m和n,其中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年1月12日應輸入為19990112),程式將判斷兩個日期的先後順序,以及兩個日期之間的間隔天數(例
編寫一個Java應用程式,當用戶在輸入對話方塊中輸入兩個日期後(日期格式為YYYYMMDD, 如1999年1月12日應輸入為19990112), 程式將判斷兩個日期的先後順序, 以及兩個日期之間的間隔天數(例如1999年1月1日和1999年1月2日之間的間隔是1天。
C語言例項12——輸入兩個正整數m和n,求其最大公約數和最小公倍數。
題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。 //程式分析:利用輾除法。 #include<stdio.h> int main(){ int a,b,num1,num2,te
【程式6】 題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。
在迴圈中,只要除數不等於0,用較大數除以較小的數,將小的一個數作為下一輪迴圈的大數,取得的餘數作為下一輪迴圈的較小的數,如此迴圈直到較小的數的值為0,返回較大的數,此數即為最大公約數,最小公倍數為兩數之積除以最大公約數。 import java.util.Scanner;
【程式6】 題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。
/* 2017年3月2日15:10:11 java基礎50道經典練習題 例6 Author:ZJY(&&) Purpose:最大公約數和最小公倍數的應用 最大公約數:把每個數分別分解質因數,再把各數中的全部公有質 因數提取出來連乘,所得的積就
c語言:輸入兩個正整數m和n,求其最大公約數和最小公倍數
輸入兩個正整數m和n,求其最大公約數和最小公倍數。解:程式:#include <stdio.h>int main(){int num1, num2, t,p;printf("請輸入兩個正整數
Java小程式:輸入兩個正整數m和n,利用輾除法求其最大公約數
java:輸入兩個正整數m和n,求其最大公約數和最小公倍數。程式分析:利用輾除法。 程式執行截圖: 輾除法 輾轉相除法, 又名歐幾里德演算法(Euclidean algorithm)乃求兩個正整數之最大公因子的演算法。它是已知最古老的演算法, 其可追溯至3000年前。
【程式16】 題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。
#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位)整數m和n的二進位制表達中, 有多少個位(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最接近的子陣列之和。 看了寫網上有些
線性代數:第一章 行列式(1)n階行列式 行列式的性質
第一節 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