首先,有一个随机访问随机数生成器,你不仅可以按顺序生成随机数,因为我们都习惯了,假设rand100()总是生成0-100的值:
for (int i=0;i<5;i++)
print rand100()
output:
14
75
36
22
67
Run Code Online (Sandbox Code Playgroud)
但也随机访问任何随机值,如:
只要您没有更改种子,rand100(0)就会输出14
rand100(3)总是输出22
rand100(4)总是输出67
等等...
我实际上发现了一个开源生成器算法,但是你不能改变种子.我知道伪随机性是一个复杂的领域; 我不知道如何改变它来添加该功能.
是否有可播种的随机访问随机数生成器,最好是开源?还是有一个更好的术语我可以谷歌获取更多信息?
如果没有,我的问题的第2部分是,是否有任何可靠的随机开源传统可种子伪随机数生成器,所以我可以将它移植到多个平台/语言,同时为任何给定的种子保留每个平台的一致值序列?
我有一个巨大的文件,我必须在特定的位置插入某些字符.在C#中最简单的方法是什么,而不是再次重写整个文件.
我想将最后10MB的可能大文件复制到另一个文件中.理想情况下,我会使用FileInputStream,skip()然后read().但是我不确定skip()的性能是否会很糟糕.skip()通常是使用下面的文件搜索实现的,还是实际读取和丢弃数据?
我知道RandomAccessFile,但我对是否可以使用FileInputStream代替它感兴趣(RandomAccessFile很烦人,因为API是非标准的).
是否有Python文件类型用于访问随机行而不遍历整个文件?我需要在一个大文件中搜索,将整个内容读入内存是不可能的.
任何类型或方法将不胜感激.
在kjellkod的文章中提到过,如果我们传入作为参数ArrayList接收的方法List,那么我们会失去性能,因为ArrayList实现了额外的RandomAccess接口.文章示例:
// SLOWER: as shown in http://ideone.com/1wnF1
private static void linearInsertion(Integer[] intArray, List<Integer> list) {
[...]
int list_size = list.size();
for (int i = 0; i < list_size; i++) {
if (integer.compareTo(list.get(i)) >= 0) { // ... more code
// FASTER: as shown in http://ideone.com/JOJ05
private static void linearInsertion(Integer[] intArray, ArrayList<Integer> list) {
[...]
int list_size = list.size();
for (int i = 0; i < list_size; i++) {
if (integer.compareTo(list.get(i)) >= 0) …Run Code Online (Sandbox Code Playgroud) 我希望能够随机访问gzip压缩文件.我可以负担得起对它进行一些预处理(比如构建某种索引),只要预处理的结果比文件本身小得多.
有什么建议?
我的想法是:
language-agnostic compression gzip random-access large-files
我一直在寻找有关如何在python中生成随机数的类似问题.示例:类似问题 - 但我没有问题,随机函数每次都返回相同的值.
我的随机生成器工作正常,问题是它在调用函数时返回相同的值,我认为,同样的第二个是不可取的.
我的代码看起来像这样
def getRandomID():
token = ''
letters = "abcdefghiklmnopqrstuvwwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
for i in range(1,36):
token = token + random.choice(letters)
return token
Run Code Online (Sandbox Code Playgroud)
正如我所提到的,当在不同时间调用时,此函数返回不同的值,但在同时调用函数时返回相同的值.我该如何避免这个问题?
我在后端服务器中使用此函数为前端用户生成唯一ID以插入数据库,因此在发生这种情况时我无法控制时间间隔.我必须有随机令牌来映射数据库中的用户,以便能够在数据库中使用queuenumbers正确插入它们.
在我的程序中,关闭java.util.RandomAccessFile有时需要45秒(好吧,几乎完全是:在44.998和45.003秒之间).该程序创建和关闭许多小文件.通常关闭文件非常快(在0到0.1秒之间).如果我调试程序,它将停留在本机方法RandomAccessFile.close0中.
使用FileOutputStream而不是RandomAccessFile时也会出现同样的问题(在这种情况下,程序在本机方法FileOutputStream.close0中被阻止).
有人知道那会是什么吗?你能在你的系统上重现这个问题(我只能在Mac上重现它,而不能在Windows XP上重现;我还没有在Linux上测试过)?
更新2:
这似乎只发生在Mac OS X上.我使用的是JDK 1.6.0_22-b04.它发生在32位和64位上.在Windows XP上似乎没有发生.
我的测试用例是:
import java.io.File;
import java.io.RandomAccessFile;
public class TestFileClose {
public static void main(String... args) throws Exception {
for (int i = 0; i < 100000; i++) {
String name = "test" + i;
RandomAccessFile r = new RandomAccessFile(name, "rw");
r.write(0);
long t = System.currentTimeMillis();
r.close();
long close = System.currentTimeMillis() - t;
if (close > 200) {
System.out.println("closing " + name +
" took " + close + " ms!");
} …Run Code Online (Sandbox Code Playgroud) 由于点亮率模式下的AES非常适合随机访问,因此我假设我使用CipherOutputStreamAES-CTR模式创建了数据源.下面的库 - 不是我的 - 使用RandomAccessFile允许在文件中寻找特定字节偏移的库.
我最初的想法是使用CipherInputStream带有Cipher正确参数的初始化,但是用于此的API不会寻求并声明不支持mark和reset.
我是否错过了可以为我做的这一部分API,我应该查看CTR的IV /块计数器的配置并使用自定义输入流(听起来像是针对self我的霰弹枪)重新创建它采取我错过的其他方法?
这本质上是这个问题的一个受限制的版本.
假设我们有一个非常大的文本文件,包含大量的行.
我们需要从文件中随机选择一条线,具有统一的概率,但是存在约束条件:
我的第一个想法是使用lstat()调用以字节为单位获取总文件大小.fseek()然后可以用来直接访问随机字节偏移量,将类似O(1)的内容访问到文件的随机部分.
问题是我们不能再做一些事情,比如读到下一个换行符并将其称为一天,因为这会产生偏向长线的分布.
我解决这个问题的第一个想法是读取直到第一个"n"换行符(如果需要,回到文件的开头),然后从这个较小的集合中选择一个具有统一概率的行.可以安全地假设文件的内容是随机排序的,因此这个子样本在长度上应该是统一的,并且,由于它的起始点是从所有可能的点统一选择的,所以它应该代表从文件中统一选择的整个.所以,在伪C中,我们的算法看起来像:
lstat(filepath, &filestat);
fseek(file, (int)(filestat.off_t*drand48()), SEEK_SET);
char sample[n][BUFSIZ];
for(int i=0;i<n;i++)
fgets(sample[i], BUFSIZ, file); //plus some stuff to deal with file wrap around...
return sample[(int)(n*drand48())];
Run Code Online (Sandbox Code Playgroud)
这似乎不是一个特别优雅的解决方案,我并不完全相信它会是统一的,所以我想知道是否有更好的方法来做到这一点.有什么想法吗?
编辑:进一步考虑,我现在很确定我的方法不统一,因为起点更可能在更长的单词内,因此不统一.整蛊!
random-access ×10
java ×4
random ×3
file ×2
large-files ×2
python ×2
.net ×1
aes ×1
arraylist ×1
c ×1
c# ×1
compression ×1
encryption ×1
file-io ×1
gzip ×1
inputstream ×1
iteration ×1
jdk1.6 ×1
seek ×1
time ×1