почему этот метод возвращает ту же случайную строку каждый раз?

Вам необходимо реализовать onClickListener для события click. onTouchListener будет недостаточно для этого случая (так как он предназначен для обработки совершенно другого типа события).

(обновлено) Это будет примерно так:

linear1.setOnClickListener( new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // Do things here, this will be run when the element is clicked
    }
});

Обновлено (по запросу): Ваш onTouchListener должен (afaict) содержат это сейчас:

linear1.setOnTouchListener(new View.OnTouchListener() {
                float initX;
                float initY;
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    switch(event.getAction()) {
                        case MotionEvent.ACTION_DOWN:
                            initX = event.getX();
                            initY = event.getY();
                            break;
                        case MotionEvent.ACTION_UP:
                            initX -= event.getX();
                            initY -= event.getY();
                            if (initY > len) {
                                //Logic For Swipe Right
                            } else if(initY < -len) {
                                //Logic For Swipe Left   
                            }
                            break;
                     }
                     return true;
                }
});

Надеюсь, это поможет,

5
задан Toto 4 January 2014 в 12:41
поделиться

6 ответов

Вы создаете Случайные экземпляры слишком близко по времени. Каждый экземпляр инициализируется с использованием системных часов, и, поскольку часы не изменились, вы получаете одну и ту же последовательность случайных чисел снова и снова.

Создайте единственный экземпляр класса Random и используйте его снова и снова. и более.

Используйте ключевое слово using , чтобы StreamWriter закрывался и удалялся, когда вы закончите с ним. Код цикла легче распознать, если использовать ключевое слово for .

using (StreamWriter SW = new StreamWriter("c:\\test.txt")) {
   Random rnd = new Random();
   for (int x = 100; x > 0; x--) {
      SW.WriteLine(RandomString(rnd, 20));
   }
}

Метод принимает объект Random в качестве параметра.

Также используйте длину для инициализировать StringBuilder с правильной емкостью, чтобы ему не приходилось перераспределять во время цикла. Используйте оператор <вместо <= в цикле, в противном случае вы создадите строку, которая на один символ длиннее, чем указывает параметр length .

private static string RandomString(Random rnd, int length) {
   StringBuilder sb = new StringBuilder(length);
   for (int i = 0; i < length; i++) {
      int x = rnd.Next(65, 122);
      sb.Append((char)x);
   }
   return sb.ToString();        
}
25
ответ дан 18 December 2019 в 05:15
поделиться

Потому что вы создаете новый объект Random в каждом вызове.

Просто переместите randomNumber из метода и сделайте его членом класса.

private Random randomNumber = new Random();
private static string RandomString(int Length)
{
    StringBuilder sb = new StringBuilder();
    //...
}

Все программные генераторы случайных чисел являются «псевдослучайными» ', они производят последовательность чисел на основе (начального) начального числа. С одним и тем же семенем они производят одинаковую последовательность. Иногда это бывает полезно. Если вы хотите, чтобы ваша программа производила одну и ту же последовательность при каждом запуске, вы можете использовать new Random (0) .

Изменить: очевидно, класс .Net Random автоматически заполняется, я этого не делал. не знаю этого. Так что это проблема времени, как указывали другие

.
4
ответ дан 18 December 2019 в 05:15
поделиться

Похоже, вы уже знакомы с некоторыми недостатками и преимуществами.

Некоторые другие: a) Делает возможным поддерживать правильную оптимизацию хвостового вызова, даже если базовая реализация не поддерживает ее б) Легче создавать такие вещи, как "трассировка стека" на уровне языка. c) Легче добавлять правильные продолжения, как вы отметили

. Недавно я написал простой интерпретатор "Scheme" на C #, который изначально использовал стек .NET. Затем я переписал его, чтобы использовать явный стек - так что, возможно, вам поможет следующее:

Первая версия использовала неявный стек времени выполнения .NET ...

Первоначально это была просто иерархия классов с другими формы (Lambda, Let и т. д.) являются реализациями следующего интерфейса:

// A "form" is an expression that can be evaluted with
// respect to an environment
// e.g.
// "(* x 3)"
// "x"
// "3"
public interface IForm
{
    object Evaluate(IEnvironment environment);
}

IEnvironment выглядела так, как и следовало ожидать:

/// <summary>
/// Fundamental interface for resolving "symbols" subject to scoping.
/// </summary>
public interface IEnvironment
{
    object Lookup(string name);
    IEnvironment Extend(string name, object value);
}

Для добавления «встроенных функций» к моему интерпретатору схемы у меня изначально был следующий интерфейс:

/// <summary>
/// A function is either a builtin function (i.e. implemented directly in CSharp)
/// or something that's been created by the Lambda form.
/// </summary>
public interface IFunction
{
    object Invoke(object[] args);
}

Это было тогда, когда он использовал неявный стек времени выполнения .NET. Кода определенно было меньше, но было невозможно добавить такие вещи, как правильная хвостовая рекурсия, и, что наиболее важно, моему интерпретатору было неудобно обеспечивать «языковой уровень» системные часы и конечный разрешающая способность. В результате разные Случайные объекты, созданные в близкая преемственность призывом к конструктор по умолчанию будет иметь идентичные начальные значения по умолчанию и, поэтому будут производить идентичные наборы случайных чисел.

Так что либо вызовите конструктор Random () только один раз в начале вашей программы, либо используйте конструктор Random (int32) и самостоятельно определите переменное начальное число.

12
ответ дан 18 December 2019 в 05:15
поделиться

объявлять randomNumber только один раз



public class MyClass
{
    private static Random randomNumber = new Random();

    private static string RandomString(int Length)
    {
        StringBuilder sb = new StringBuilder();  

        for (int i = 0; i ... Length; ++i)
        {
        int x = MyClass.randomNumber.Next(65, 122);
        sb.Append(Convert.ToChar(x));
        }
        return sb.ToString();        
    }
}
3
ответ дан 18 December 2019 в 05:15
поделиться

начальное число для случайного все числа одинаковы из-за небольшого количества времени, которое требуется, по сути, вы каждый раз воссоздаете случайный генератор с одним и тем же начальным значением, поэтому вызов Next () возвращает то же случайное значение.

1
ответ дан 18 December 2019 в 05:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: