В $CUDA_HOME/include/host_config.h
найдите такие строки (они могут незначительно меняться между разными версиями CUDA):
//...
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 9)
#error -- unsupported GNU version! gcc versions later than 4.9 are not supported!
#endif [> __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 9) <]
//...
Удалите или измените их, соответствующие вашему условию.
Обратите внимание на этот метод является потенциально опасным и может нарушить вашу сборку. Например, gcc 5 использует C ++ 11 по умолчанию, однако это не относится к nvcc с CUDA 7.5. Обходным путем является добавление
--Xcompiler="--std=c++98"
для CUDA & lt; = 6.5
или
--std=c++11
для CUDA> = 7.0.
Вот решение. Взгляните на метод select (), который делает реальную вещь (метод main () неоднократно выполняет функцию select (), чтобы показать, что распределение действительно довольно равномерное).
Идея проста: когда вы читаете первую строчку, у нее есть 100% шанс быть выбранным в качестве результата. Когда вы читаете вторую строчку, у нее есть 50% шанс заменить первую строку в качестве результата. Когда вы читаете 3-ю строчку, у нее есть 33% шанс стать результатом. Четвертая строка имеет 25% и т. Д ....
import java.io.*;
import java.util.*;
public class B {
public static void main(String[] args) throws FileNotFoundException {
Map<String,Integer> map = new HashMap<String,Integer>();
for(int i = 0; i < 1000; ++i)
{
String s = choose(new File("g:/temp/a.txt"));
if(!map.containsKey(s))
map.put(s, 0);
map.put(s, map.get(s) + 1);
}
System.out.println(map);
}
public static String choose(File f) throws FileNotFoundException
{
String result = null;
Random rand = new Random();
int n = 0;
for(Scanner sc = new Scanner(f); sc.hasNext(); )
{
++n;
String line = sc.nextLine();
if(rand.nextInt(n) == 0)
result = line;
}
return result;
}
}
Чтение всего файла, если вы хотите, чтобы только одна строка казалась немного чрезмерной. Следующее должно быть более эффективным:
Это вариант отбраковка .
Длина линии включает символ (-ы) линии окончания, поэтому MIN_LINE_LENGTH> = 1. (Тем лучше, если вы знаете более жесткую привязку длины строки).
Стоит отметить, что время выполнения этого алгоритма не зависит от размера файла, а только от длины строки, то есть оно масштабируется намного лучше, чем чтение всего файла.
List<Integer>
смещений, которые затем могут быть рандомизированы через Collections.shuffle()
.
– trashgod
8 February 2010 в 01:08
Оглядываясь на ответ Итай, похоже, что он читает файл тысячу раз после выборки одной строки кода, тогда как истинная выборка коллектора должна проходить только по «ленте» один раз. Я разработал код для перебора кода один раз с реальной выборкой коллектора на основе этого и различных описаний в Интернете.
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
public class reservoirSampling {
public static void main(String[] args) throws FileNotFoundException, IOException{
Sampler mySampler = new Sampler();
List<String> myList = mySampler.sampler(10);
for(int index = 0;index<myList.size();index++){
System.out.println(myList.get(index));
}
}
}
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
public class Sampler {
public Sampler(){}
public List<String> sampler (int reservoirSize) throws FileNotFoundException, IOException
{
String currentLine=null;
//reservoirList is where our selected lines stored
List <String> reservoirList= new ArrayList<String>(reservoirSize);
// we will use this counter to count the current line number while iterating
int count=0;
Random ra = new Random();
int randomNumber = 0;
Scanner sc = new Scanner(new File("Open_source.html")).useDelimiter("\n");
while (sc.hasNext())
{
currentLine = sc.next();
count ++;
if (count<=reservoirSize)
{
reservoirList.add(currentLine);
}
else if ((randomNumber = (int) ra.nextInt(count))<reservoirSize)
{
reservoirList.set(randomNumber, currentLine);
}
}
return reservoirList;
}
}
Основная предпосылка заключается в том, что вы заполните резервуар, а затем вернитесь к нему и заполните случайные линии с вероятностью 1 / ReservoirSize. Надеюсь, это обеспечит более эффективный код. Пожалуйста, дайте мне знать, если это не сработает для вас, поскольку я буквально сбил его через полчаса.
Либо вы
Используйте BufferedReader и прочитайте строку. Использовать объект java.util.Random для случайного прерывания;)