天道酬勤,学无止境

R删除重复的数字序列(R remove repeated digit sequences)

问题

我正在尝试删除字符串中除第一组数字之外的所有数字。 因此,换句话说,所有重复的数字集,字符串中可能有 1 组或 10+ 组,但我只想保留第一组和字符串的其余部分。

例如,以下字符串:

x <- 'foo123bar123baz123456abc1111def123456789'

结果将是:

foo123barbazabcdef

我曾尝试使用gsub并用空字符串替换\d+但这会替换字符串中的所有数字,我也尝试使用组来捕获一些结果但没有运气。

回答1

使用 gsub,您可以使用\G功能,这是一个可以匹配两个位置之一的锚点。

x <- 'foo123bar123baz123456abc1111def123456789'
gsub('(?:\\d+|\\G(?<!^)\\D*)\\K\\d*', '', x, perl=T)
# [1] "foo123barbazabcdef"

说明

(?:           # group, but do not capture:
  \d+         #   digits (0-9) (1 or more times)
 |            # OR
  \G(?<!^)    #   contiguous to a precedent match, not at the start of the string
  \D*         #   non-digits (all but 0-9) (0 or more times)
)\K           # end of grouping and reset the match from the result
\d*           # digits (0-9) (0 or more times)

或者,您可以使用可选组:

gsub('(?:^\\D*\\d+)?\\K\\d*', '', x, perl=T)

我发现有用且不需要(*SKIP)(*F)回溯动词或\G\K功能的另一种方法是在上下文中使用交替运算符,将要匹配的内容放在左侧的捕获组中并将您要排除的内容放在右侧,(说扔掉,这是垃圾......)

gsub('^(\\D*\\d+)|\\d+', '\\1', x)
回答2

你可以通过 PCRE 动词 (*SKIP)(*F) 来做到这一点。

^\D*\d+(*SKIP)(*F)|\d+

^\D*\d+匹配从开始到第一个数字的所有字符。 (*SKIP)(*F)导致匹配失败,然后正则表达式引擎尝试使用位于|右侧的模式匹配字符|\d+对剩余的字符串。 因为(*SKIP)(*F)是 PCRE 动词,所以您必须启用perl=TRUE参数。

演示

代码:

> x <- 'foo123bar123baz123456abc1111def123456789'
> gsub("^\\D*\\d+(*SKIP)(*F)|\\d+", "", x, perl=TRUE)
[1] "foo123barbazabcdef"
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 删除序列中重复的数字(Remove repeated numbers in a sequence)
    问题 我有一个类型的向量 c(3,3,...,9,9,...,2,2,...,3,3,...,7,7,...) 我想在不破坏顺序的情况下删除序列中的重复数字。 这是,我想获得类似的东西 c(3,9,2,3,7,...) 我怎样才能在 R 中做到这一点? 回答1 我们可以尝试使用rleid和duplicated 。 我们使用rleid (来自data.table )创建 run-length-ids,以便只有相等的相邻元素形成一组,获取不duplicated值的逻辑索引并对向量进行子集化。 library(data.table) v1[!duplicated(rleid(v1))] #[1] 3 9 2 3 7 或者正如 OP 所提到的,我们可以使用base R rle并提取values 。 rle(v1)$values #[1] 3 9 2 3 7 数据 v1 <- c(3,3,9,9,2,2,3,3,7,7) 回答2 我们还可以使用观察结果,即序列中的重复与它们的邻居的差异为 0。 因此,使用 base-R,我们可以: v[c(1,diff(v))!=0] 回答3 只是为了好玩,这是解决问题的Rcpp版本: library(Rcpp) cppFunction('NumericVector remove_multiples(NumericVector& vec) {
  • 如何检查整数中的重复序列(How to check for repeating sequence in an integer)
    问题 我有一个字母数字字符串,我想检查其中是否有仅针对整数的模式重复。 它们应该是连续的。 例子 12341234qwe应该告诉我1234是重复的。 1234qwe1234不应该告诉我,因为它不是连续的那1234是重复的。 12121212应该被视为12被重复,因为这是第一个被发现被重复的集合。 但是,如果有一种算法可以找到1212作为12之前的重复集,那么我想它必须在1212上再次执行这些步骤。 我认为我可以通过在不同的StringBuilder迭代并将其与( <= '0' && >= '9')进行比较来存储整数部分。 然后我阅读了关于对字符串执行 FFT 的内容,它显示了重复的模式。 但我不知道如何在 Java 中执行 FFT 并查找结果,此外,我希望尝试在不进行信号处理的情况下执行此操作。 我读过 KMP 模式匹配,但这仅适用于给定的输入。 还有其他方法吗? 回答1 我认为您可以借助正则表达式来解决这个问题。 考虑这样的代码: String arr[] = {"12341234abc", "1234foo1234", "12121212", "111111111", "1a1212b123123c12341234d1234512345"}; String regex = "(\\d+?)\\1"; Pattern p = Pattern.compile(regex); for
  • 如何匹配dna序列模式(how to match dna sequence pattern)
    问题 我很难找到解决此问题的方法。 输入输出顺序如下: **input1 :** aaagctgctagag **output1 :** a3gct2ag2 **input2 :** aaaaaaagctaagctaag **output2 :** a6agcta2ag 输入序列可以是10 ^ 6个字符,并且将考虑最大的连续模式。 例如,对于输入2“ agctaagcta”,输出将不是“ agcta2gcta”,但将是“ agcta2”。 任何帮助表示赞赏。 回答1 算法说明: 具有带有符号s(1),s(2),…,s(N)的序列S。 令B(i)是元素s(1),s(2),…,s(i)的最佳压缩序列。 因此,例如,B(3)将是s(1),s(2),s(3)的最佳压缩序列。 我们想知道的是B(N)。 为了找到它,我们将通过归纳进行。 我们想知道B(i),B(i-1),B(i-2),...,B(1),B(0)来计算B(i + 1),其中B(0)为空且B(1)= s(1)。 同时,这构成了解决方案最优的证明。 ;) 为了计算B(i + 1),我们将在候选者中选择最佳序列: 最后一个块具有一个元素的候选序列: B(i)s(i + 1)1 B(i-1)s(i + 1)2; 仅当s(i)= s(i + 1)B(i-2)s(i + 1)3时; 仅当s(i-1)= s(i)且s(i)= s(i + 1)
  • 创建无重复的随机数序列(Create Random Number Sequence with No Repeats)
    问题 复制: O(1)中的唯一随机数? 我想要一个伪随机数生成器,它可以生成没有随机顺序重复的数字。 例如: 随机的(10) 可能返回5、9、1、4、2、8、3、7、6、10 除了确定数字范围并将其改组或检查生成的列表是否重复之外,还有其他更好的方法吗? 编辑: 我也希望它能在没有整个范围的情况下有效地生成大数字。 编辑: 我看到每个人都在建议改组算法。 但是,如果我想生成一个较大的随机数(1024字节+),那么与仅使用常规RNG并将其插入Set中直到达到指定的长度相比,该方法将占用更多的内存,对吗? 没有更好的数学算法可以做到这一点。 回答1 您可能对线性反馈移位寄存器感兴趣。 我们以前是用硬件来构建它们的,但是我也已经用软件来完成它们。 它使用移位寄存器,将某些位进行异或并反馈到输入,如果您选择正确的“抽头”,则可以获得与寄存器大小一样长的序列。 也就是说,一个16位的lfsr可以产生一个65535长的序列,没有重复。 它在统计上是随机的,但当然可以重复。 另外,如果做错了,您可以得到一些令人尴尬的短序列。 如果您查找lfsr,将找到有关如何正确构造它们(即“最大长度”)的示例。 回答2 随机播放是执行此操作的绝佳方法(前提是您不使用朴素算法引入偏差)。 请参阅Fisher-Yates随机播放。 回答3 为了确保该列表不会重复,它必须保留以前返回的数字的列表。 因此
  • 生成一个没有重复数字的随机数?(Generate a random number with no repeating digits?)
    问题 我想生成一个随机数,每个数字都在 0-9 的范围内并且不重复。 假设有限长度为 4。 1234 限定,每个复合数字都是唯一的。 1123没有,1重复 请问这怎么办? 回答1 要生成数字: std::vector<int> vec = {0,1,2,3,4,5,6,7,8,9}; // or initialize from array if not c++11 std::random_shuffle(vec.begin(), vec.end()); vec.resize(4); 并将数字连接成一个数字: int number = 0; for (auto i = vec.begin(); i != vec.end(); ++i) { number = 10 * number + (*i); } 回答2 我相信你在谈论生成排列。 尝试这样的事情: int used[10] = {0}; int n = 0; int number = 0; while( n < 10 ) { int d = rand() % 10; if( used[d] ) continue; used[d] = 1; number = number * 10 + d; n++; } 不是最有效的......它只是跟踪使用了哪些数字,并在遇到使用过的数字时重新滚动。 以上确实有副作用,如果零是选择的第一个数字
  • 在bash中生成不重复的随机数序列(generate non-repeating random number sequences in bash)
    问题 今晚我一直在忙于学习 bash,我一直在尝试创建一个随机数序列,该序列使用一个范围内的所有数字,并且每个数字只使用一次。 所以像输入 1-5 的范围会输出像 4-3-5-2-1 或 2-5-1-3-4 之类的东西。 我被困在这个问题上。 谢谢! 回答1 以下命令并非特定于 bash,但它有效 seq 1 5 | shuf 一个更特定于子字符串的 bash x=12345 for((i=5;i>0;i--));do ((r=RANDOM%i+1)) echo ${x:r-1:1} x=${x:0:r-1}${x:r} done
  • 编号到包含重复项的序列的唯一排列映射(number to unique permutation mapping of a sequence containing duplicates)
    问题 我正在寻找一种可以将数字映射到序列的唯一排列的算法。 由于类似的问题,快速排列 -> 数字 -> 排列映射算法,我发现了莱默码和阶乘数系统,但该问题不涉及序列中存在重复元素的情况。 例如,采用序列“AAABBC”。 有6个! = 720 种可以排列的方式,但我相信只有 6 种! / (3! * 2! * 1!) = 此序列的 60 个唯一排列。 在这些情况下,如何将数字映射到排列? 编辑:将术语“设置”更改为“序列”。 回答1 从排列到数字: 设 K 为字符类的数量(例如:AAABBC 有三个字符类) 令 N[K] 为每个字符类中的元素数。 (例如:对于 AAABBC,我们有 N[K]=[3,2,1],让 N= sum(N[K]) 序列的每个合法排列然后唯一地对应于不完整 K-way 树中的一条路径。 然后,排列的唯一编号对应于 K 元树终端节点的后序遍历中的树节点的索引。 幸运的是,我们实际上不必执行树遍历——我们只需要知道树中有多少终端节点按字典顺序小于我们的节点。 这很容易计算,因为在树中的任何节点处,当前节点下方的终端节点数等于使用序列中未使用元素的排列数,它具有封闭形式的解决方案,即简单的乘法阶乘。 因此,鉴于我们的 6 个原始字母,并且我们排列的第一个元素是“B”,我们确定将有 5!/3!1!1! = 20 个以“A”开头的元素,因此我们的排列数必须大于 20
  • 如何在不使用字符串或数组的情况下按升序对整数进行排序?(How to sort Integer digits in ascending order without Strings or Arrays?)
    问题 我试图按升序对任意长度整数的数字进行排序,而不使用字符串,数组或递归。 例子: Input: 451467 Output: 144567 我已经弄清楚了如何用模数除法获得整数的每个数字: int number = 4214; while (number > 0) { IO.println(number % 10); number = number / 10; } 但是我不知道如何在没有数组的情况下排序数字。 不用担心IO类; 这是我们教授给我们的习俗课。 回答1 实际上有一个非常简单的算法,它仅使用整数: int number = 4214173; int sorted = 0; int digits = 10; int sortedDigits = 1; boolean first = true; while (number > 0) { int digit = number % 10; if (!first) { int tmp = sorted; int toDivide = 1; for (int i = 0; i < sortedDigits; i++) { int tmpDigit = tmp % 10; if (digit >= tmpDigit) { sorted = sorted/toDivide*toDivide*10 + digit*toDivide +
  • 具有大写字母和数字的随机字符串生成(Random string generation with upper case letters and digits)
    问题 我想生成一个大小为N的字符串。 它应该由数字和大写英文字母组成,例如: 6U1S75 4Z4UKK U911K4 如何以pythonic方式实现此目标? 回答1 一行回答: ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N)) 甚至更短,使用random.choices()从Python 3.6开始: ''.join(random.choices(string.ascii_uppercase + string.digits, k=N)) 加密方式更安全的版本; 参见https://stackoverflow.com/a/23728630/2213647: ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(N)) 详细而言,具有清除函数以供进一步重用: >>> import string >>> import random >>> def id_generator(size=6, chars=string.ascii_uppercase + string.digits): ... return ''.join(random.choice
  • 如何在Bash中重复一个角色?(How can I repeat a character in Bash?)
    问题 我该如何用echo做到这一点? perl -E 'say "=" x 100' 回答1 您可以使用: printf '=%.0s' {1..100} 工作原理: Bash展开{1..100},因此命令变为: printf '=%.0s' 1 2 3 4 ... 100 我已经将printf的格式设置为=%.0s ,这意味着无论给出什么参数,它都将始终打印单个= 。 因此它打印100 = s。 回答2 没有简单的方法。 但例如: seq -s= 100|tr -d '[:digit:]' 或者也许是符合标准的方式: printf %100s |tr " " "=" 还有一个tput rep ,但是至于我手边的终端(xterm和linux),它们似乎不支持它:) 回答3 向@gniourf_gniourf表示感谢。 注意:这个答案没有回答原来的问题,但通过比较性能将与现有的,有用的答案。 仅在执行速度方面比较解决方案-不考虑内存需求(它们在解决方案中会有所不同,并且可能与大重复次数有关)。 概括: 如果您的重复次数很少(例如最多100次),那么值得使用仅Bash的解决方案,因为外部实用程序的启动成本至关重要,尤其是Perl的启动成本。 实用上来说,如果只需要一个重复字符的实例,那么所有现有的解决方案都可以。 随着大量的重复次数,使用外部公共事业,因为他们会快很多。
  • 创建没有重复的随机数(Creating random numbers with no duplicates)
    问题 在这种情况下,MAX仅为5,因此我可以一张一张地检查重复项,但是我怎么能以一种更简单的方式做到这一点呢? 例如,如果MAX的值为20,该怎么办? 谢谢。 int MAX = 5; for (i = 1 , i <= MAX; i++) { drawNum[1] = (int)(Math.random()*MAX)+1; while (drawNum[2] == drawNum[1]) { drawNum[2] = (int)(Math.random()*MAX)+1; } while ((drawNum[3] == drawNum[1]) || (drawNum[3] == drawNum[2]) ) { drawNum[3] = (int)(Math.random()*MAX)+1; } while ((drawNum[4] == drawNum[1]) || (drawNum[4] == drawNum[2]) || (drawNum[4] == drawNum[3]) ) { drawNum[4] = (int)(Math.random()*MAX)+1; } while ((drawNum[5] == drawNum[1]) || (drawNum[5] == drawNum[2]) || (drawNum[5] == drawNum[3]) || (drawNum
  • 按顺序创建重复值的顺序?(Create sequence of repeated values, in sequence?)
    问题 我需要一个重复的数字序列,即1 1 ... 1 2 2 ... 2 3 3 ... 3 etc. 。我实现此方法的方法是: nyear <- 20 names <- c(rep(1,nyear),rep(2,nyear),rep(3,nyear),rep(4,nyear), rep(5,nyear),rep(6,nyear),rep(7,nyear),rep(8,nyear)) 可以,但是笨拙,显然扩展性不佳。 如何依次将N个整数重复M次? 我尝试嵌套seq()和rep()但是并没有完全满足我的要求。 我显然可以编写一个for循环来执行此操作,但是应该有一个固有的方法来执行此操作! 回答1 您错过了rep()的each=参数: R> n <- 3 R> rep(1:5, each=n) [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 R> 所以你的例子可以用一个简单的 R> rep(1:8, each=20) 回答2 另一个base R选项可以是gl() : gl(5, 3) 输出是一个因素: [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 Levels: 1 2 3 4 5 如果需要整数,则可以将其转换为: as.numeric(gl(5, 3)) [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 回答3
  • 如何在给定数组中查找重复的字符序列?(How to find repeating sequence of characters in a given array?)
    问题 我的问题是在给定数组中找到字符的重复序列。 简单地,以识别字符出现的模式。 .---.---.---.---.---.---.---.---.---.---.---.---.---.---. 1: | J | A | M | E | S | O | N | J | A | M | E | S | O | N | '---'---'---'---'---'---'---'---'---'---'---'---'---'---' .---.---.---.---.---.---.---.---.---.---.---.---.---.---.---. 2: | R | O | N | R | O | N | R | O | N | R | O | N | R | O | N | '---'---'---'---'---'---'---'---'---'---'---'---'---'---'---' .---.---.---.---.---.---.---.---.---.---.---.---. 3: | S | H | A | M | I | L | S | H | A | M | I | L | '---'---'---'---'---'---'---'---'---'---'---'---' .---.---.---.---.---.---.---.---.---.---
  • 剑指offer(第二版) Python3实现
    文章目录 剑指offer Python题解3.数组中重复的数字题目描述解法 4.二维数组中的查找题目描述解法: 5.替换空格题目描述解法: 6.从尾到头打印链表题目描述解法: 7.重建二叉树题目描述解法: 8.二叉树的下一个节点题目描述解法: 9.用两个栈实现队列题目描述解法: 10.斐波那契数列题目描述解法: 11.旋转数组中的最小数字题目描述解法: 12.矩阵中的路径题目描述解法: 13.机器人的运动范围题目描述解法: 14.剪绳子题目描述解法: 15.二进制中 1 的个数题目描述解法: 16.数值的整数次方题目描述解法: 18.删除列表中重复的节点题目描述解法: 19.正则表达式匹配题目描述解法: 20.表示数值的字符串题目描述解法: 21.调整数组顺序使奇数位于偶数前面题目描述解法: 22.链表中倒数第 k 个节点题目描述解法: 23.链表中环的入口节点题目描述解法: 24.反转链表题目描述解法: 25.合并两个排序的链表题目描述解法: 26.树的子结构题目描述解法: 27.二叉树的镜像题目描述输入描述解法: 28.对称的二叉树题目描述输入描述解法: 29.顺时针打印矩阵题目描述解法: 30.包含min函数的栈题目描述解法: 31.栈的压入弹出序列题目描述解法: 32.从上到下打印二叉树题目描述解法: 33.二叉搜索树的后序遍历序列题目描述解法: 34
  • R语言笔记2赋值设置、运算和向量及课后练习题
    赋值设置、运算和向量 1. 赋值设置 设置数字位数 设置显示保留3位数字,包括整数部分,若数字首位为零则不算入位数 > options(digits=3) > 1/3 [1] 0.33333 > 10/3 [1] 3.3333 科学计数法 在科学计数法中,xey即表示为x×(10)^y > 10000000 [1] 1e+07 > 0.00000025 [1] 2.5e-07 2. 运算 平方根计算 > sqrt(x=16) [1] 4 对数与指数计算 在R中,log默认为自然函数,即以欧拉系数e为底的对数函数,e≈2.718 > log(x=20.08554) [1] 3 若要改变底数则添加变量base= > log(x=625,base=25) [1] 2 对于以欧拉系数e为底的指数计算 > exp(x=3) [1] 20.08554 3.赋值 创建向量 建立向量的函数是c(),括号内用逗号分割元素,冒号表示逐个逐个元素加1 > a<-c(1,2,3,4,5) > a [1] 1 2 3 4 5 > > b<-c(1:5) > b [1] 1 2 3 4 5 > > c<-c(a,b) > c [1] 1 2 3 4 5 1 2 3 4 5 序列函数seq 函数格式seq(from=,to=,by=,length.out=) from,产生的第一个数字to
  • LeetCode目录
    实时更新中。 文章目录 1.C语言版2.C++语言版 1.C语言版 1.LeetCode:1. Two Sum 两数之和 2.LeetCode:2. Add Two Numbers 两数相加 3.LeetCode:3. Longest Substring Without Repeating Characters 无重复字符的最长子串 5.LeetCode:5. Longest Palindromic Substring 最长回文子串 7.LeetCode:7. Reverse Integer 整数反转 8.LeetCode:8. String to Integer (atoi) 字符串转换整数 (atoi) 9.LeetCode:9.Palindrome Number 回文数 11.LeetCode:11. Container With Most Water 盛最多水的容器 13.LeetCode:13. Roman to Integer 罗马数字转整数 14.LeetCode:14. Longest Common Prefix 最长公共前缀 15.LeetCode:15. 3Sum 三数之和 16.LeetCode:16.3Sum Closest 最接近的三数之和 19.LeetCode:19. Remove Nth Node From End of
  • 如何使用 rand-int 生成可重复的随机序列(How to generate repeatable random sequences with rand-int)
    问题 我希望能够在 Clojure 中使用rand生成可重复的数字。 (具体来说,我希望对rand-nth或 Incanter sample的调用结果是可重复的,并且这些调用rand-int又调用rand )。 我从这个问题中发现,如果我使用 clojure.data.generators,我可以重置随机状态: (require '[clojure.data.generators :as gen]) (alter-var-root #'gen/*rnd* (constantly (java.util.Random. 437))) (gen/reservoir-sample 5 (range 1000)) ; => [940 591 636 12 755] (gen/reservoir-sample 5 (range 1000)) ; => [376 540 827 307 463] ; reset random state: (alter-var-root #'gen/*rnd* (constantly (java.util.Random. 437))) ; now the same results are generated again: (gen/reservoir-sample 5 (range 1000)) ; => [940 591 636 12 755] (gen
  • 【shell】shell脚本肿的文本替换工具-tr
    文章目录1. 将输入的字符小写换成大写2. 实现对密码加密3. 使用tr删除字符4. 删除多余的空行5. 将小写变成大写tr命令介绍常见参数常用命令展示总结tr命令介绍tr是一个超级好用的工具,他经常可以用来编写单行命令,对来自标准输入的内容进行字符的替换,字符的删除,以及重复字符的压缩。 也可以将一组字符变成另外一组字符。标准输入 stdin常见参数[root@rhce test]# tr --help用法:tr [选项]... SET1 [SET2]Translate, squeeze, and/or delete characters from standard input, writing to standard output. -c, -C, --complement use the complement of SET1 -d, --delete delete characters in SET1, do not translate -s, --squeeze-repeats replace each sequence of a repeated character that is listed in the last specified SET, with a single occurrence of that character -t, --truncate-set1
  • LeetCode详细题解答案整理-java
    对自己做过的LeetCode及整理的解法进行整理,便于后续复习查看。实时更新。 #TitleSolutionDifficultyRelated Topics1Two Sum 两数之和Two Sum 两数之和EasyArray,HashTable2Add Two Numbers 两数相加Add Two Numbers 两数相加MediumLinked List,Math3Longest Substring Without Repeating Characters 无重复字符的最长子串Longest Substring Without Repeating Characters 无重复字符的最长子串MediumHash Table,Two Pointers,String,Sliding Window5Longest Palindromic Substring 最长回文子串Longest Palindromic Substring 最长回文子串MediumString,Dynamic Programming6ZigZag Conversion Z字形变换ZigZag Conversion Z字形变换MediumString7Reverse Integer 颠倒整数Reverse Integer 颠倒整数EasyMath9Palindrome Number 回文数Palindrome
  • 您如何有效地生成一个介于0和上限N之间的K个非重复整数的列表[重复](How do you efficiently generate a list of K non-repeating integers between 0 and an upper bound N [duplicate])
    问题 这个问题已经在这里有了答案: O(1)中的唯一(非重复)随机数? (22个答案) 4年前关闭。 这个问题给出了所有必要的数据:在给定的时间间隔[0,N-1]内生成K个非重复整数序列的有效算法是什么? 如果K很大并且足够接近N,那么琐碎的算法(生成随机数,然后将它们添加到序列中之前先查找它们,以查看它们是否已经存在)是非常昂贵的。 从链接列表中有效地选择一组随机元素中提供的算法似乎比必需的更为复杂,并且需要一些实现。 只要您知道所有相关参数,我就找到了另一种似乎可以很好地完成工作的算法。 回答1 Python库中的random模块使它极其简单和有效: from random import sample print sample(xrange(N), K) sample函数返回从给定序列中选择的K个唯一元素的列表。 xrange是一个“列表仿真器”,即它的行为就像一个连续数字的列表,而没有在内存中创建它,这使得它非常快地执行此类任务。 回答2 Knuth在《计算机编程艺术》,第2卷:《半数值算法》,第三版中描述了以下选择采样算法: 算法S(选择采样技术)。 从一组N中随机选择n条记录,其中0 <n≤N。 S1。 [初始化。]设置t←0,m←0。(在此算法中,m表示到目前为止选择的记录数,而t是我们处理过的输入记录的总数。) S2。 [生成U。]生成一个随机数U